我有一个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
}
我看到反序列化后,枚举上的自定义字段丢失了。 在阅读更多相关内容时,我得到的印象是枚举被反序列化为字符串,因此其自定义字段将被忽略。
如果是真的,我在这里滥用Enum&应该只使用POJO? 或者有没有办法序列化自定义字段(不是构造函数的一部分)?
谢谢!
答案 0 :(得分:7)
如果值是常量,则更好,并且您不需要序列化任何内容
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,它可能包含值以及对枚举值的引用
答案 1 :(得分:6)
来自Java language specification:
Enum中的最终克隆方法确保枚举常量永远不会 被克隆,并且通过序列化机制进行特殊处理 确保永远不会创建重复实例 反序列化即可。禁止对枚举类型进行反射实例化。 总之,这四件事确保没有枚举类型的实例 存在于枚举常量定义的范围之外。
您所要求的将创建多个例如TYPE_A的实例。这会破坏枚举。枚举应该是不可变的。