3

来自ObjectInputStream 的Javadoc

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

为什么 Java 中的枚举没有全部序列化?Java 中的枚举不仅仅是常量,而且是还可以包含状态的成熟类。不会导致发送端和接收端的状态不一致吗?我在这里缺少的基本点是什么?

4

1 回答 1

7

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

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

于 2013-08-21T15:12:52.863 回答