7

我有一个 Java 枚举,如下所示:

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
}

我看到反序列化后,枚举上的自定义字段丢失了。在阅读更多关于它的信息时,我得到的印象是枚举被反序列化为一个字符串,因此它的自定义字段被忽略了。

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

谢谢!

4

2 回答 2

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
  } 
}

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

于 2013-03-20T16:48:32.707 回答
7

来自Java 语言规范

Enum 中的最终 clone 方法确保永远不会克隆 enum 常量,并且序列化机制的特殊处理确保永远不会由于反序列化而创建重复的实例。禁止枚举类型的反射实例化。这四件事一起确保枚举类型的实例不存在超出枚举常量定义的实例。

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

于 2013-03-20T16:50:39.340 回答