Java中枚举字段的序列化

时间:2013-08-21 15:11:07

标签: java serialization enums

来自Javadoc of ObjectInputStream

  

枚举常量的反序列化与普通的可序列化不同   或可外部化的对象。枚举常量的序列化形式   仅由其名称组成;常量的字段值不是   传输。要反序列化枚举常量,ObjectInputStream会读取   来自流的常量名称;然后是反序列化的常量   通过调用静态方法Enum.valueOf(Class,String)获得   枚举常量的基类型和接收的常量名称为   参数。与其他可序列化或可外部化的对象一样,枚举   常量可以作为出现的反向引用的目标   随后在序列化流中。枚举的过程   常量被反序列化无法自定义:任何特定于类的   由enum定义的readObject,readObjectNoData和readResolve方法   反序列化期间忽略类型。同样,任何   serialPersistentFields或serialVersionUID字段声明也是   忽略 - 所有枚举类型都有一个固定的serialVersionUID为0L。

为什么Java中的枚举不是完全序列化的? Java中的枚举不仅仅是常量,而且是完整的类,也可以包含状态。它是否不会导致发送端和接收端之间的状态不一致?我在这里缺少的基本点是什么?

1 个答案:

答案 0 :(得分:6)

本课程是在您需要可变对象时不使用枚举。是的,您可以设计维持内部状态的枚举,但它们不是为此而设计的。与序列化的情况一样,如果你这样做,并不是Java的所有部分都会合作。

如果必须将enum值绑定到状态数据,请使用EnumMap。该类实现Serializable,因此您不需要执行任何额外的工作来序列化您的状态数据(前提是状态数据对象本身是可序列化的。)