java enum上的自定义字段未被序列化

Nik*_*k S 7 java enums serialization custom-fields

我有一个Java Enum,如下所示:

public enum ExecutionMode {
  TYPE_A,
  TYPE_B,
  TYPE_C;

  private ExecutionMode(){} //no args constr- no really required

  private boolean incremental; //has get/set
  private String someStr;      //has get/set
}
Run Code Online (Sandbox Code Playgroud)

我看到在反序列化后,枚举上的自定义字段丢失了.在阅读更多相关内容时,我得到的印象是枚举被反序列化为字符串,因此其自定义字段将被忽略.

如果是真的,我在这里滥用Enum并且应该只使用POJO吗?或者有没有办法序列化自定义字段(不是构造函数的一部分)?

谢谢!

dfb*_*dfb 8

如果值是常量,则更好,您不需要序列化任何内容

public enum ExecutionMode {
  TYPE_A(x,t),
  TYPE_B(y,z),
  TYPE_C(b,s)

  private boolean incremental; //has get/set
  private String someStr;      //has get/set

  ExecutionMode(boolean incremental,String someStr){
        ///... set things appropriately
  } 
}
Run Code Online (Sandbox Code Playgroud)

如果你在运行时设置这些值,我倾向于首先不应该是枚举 - 应该有一个单独的POJO,它可能包含值以及对枚举值的引用.


McD*_*ell 7

Java语言规范:

Enum中的最终克隆方法确保永远不会克隆枚举常量,并且序列化机制的特殊处理可确保不会因反序列化而创建重复实例.禁止对枚举类型进行反射实例化.总之,这四件事确保除了枚举常量定义的实例之外不存在枚举类型的实例.

您要求的是创建多个例如TYPE_A的实例.这会破坏枚举.枚举应该是不可变的.