Java中枚举字段的序列化

Gee*_*eek 2 java enums serialization

ObjectInputStreamJavadoc:

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

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

Ted*_*opp 6

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

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