Java中枚举字段的序列化

3

根据ObjectInputStream的Javadoc

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

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


Java中的枚举是完整的类,可以包含状态吗?Java中的enum可以包含状态,根据设计方式,您可以更改其状态。请注意,当然,更改enum的状态并不是一个好的实践。 - Luiggi Mendoza
1个回答

7

教训是当你需要可变对象时不要使用枚举。是的,你可以设计维护内部状态的枚举,但它们并不是为此而设计的。就像序列化一样,如果这样做,Java 的某些部分可能不会合作。

如果你必须将 enum 值与状态数据联系起来,请使用 EnumMap。该类实现了 Serializable,因此您不需要额外的工作来序列化状态数据(前提是状态数据对象本身是可序列化的)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接