枚举常量与普通可序列化或外部化对象的反序列化不同。枚举常量的序列化形式仅由其名称组成;不传递该常量的字段值。要反序列化枚举常量,ObjectInputStream从流中读取常量名称;然后通过调用带有枚举常量基类型和接收常量名称作为参数的静态方法Enum.valueOf(Class,String)获得反序列化常量。与其他可序列化或可外化的对象一样,枚举常量可以充当随后出现在序列化流中的反向引用的目标。不能自定义反序列化枚举常量的过程:在反序列化过程中忽略由枚举类型定义的任何类特定的readObject、readObjectNoData和readResolve方法。类似地,任何serialPersistentFields或serialVersionUID字段声明也会被忽略--所有枚举类型都有固定的serialVersionUID为0L。
为什么Java中的枚举没有全部序列化?Java中的Enum不仅仅是常量,而且是完全成熟的类,也可以包含状态。它是否会导致发送端和接收端之间的状态不一致?我在这里错过的基本点是什么?
发布于 2013-08-21 15:12:52
教训是,当需要可变对象时,不要使用枚举。是的,您可以设计维护内部状态的枚举,但它们不是为此而设计的。与序列化的情况一样,如果您这样做,Java的所有部分都不会合作。
如果必须将enum值绑定到状态数据,请使用EnumMap。该类实现Serializable,因此您不需要做任何额外的工作来序列化状态数据(前提是状态数据对象本身是可序列化的)。
https://stackoverflow.com/questions/18361190
复制相似问题