【问题标题】:Serialization of enum fields in JavaJava中枚举字段的序列化
【发布时间】:2013-08-24 01:07:57
【问题描述】:

来自Javadoc of ObjectInputStream:

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

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

【问题讨论】:

  • Java 中的枚举是完全成熟的类,也可以包含状态? Java enum 可以包含状态,并且根据您的设计方式,您可以更改其状态,请注意,当然,更改enum 的状态不是一个好习惯。

标签: java serialization enums


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2018-07-31
    相关资源
    最近更新 更多