当前位置: 首页 > 知识库问答 >
问题:

Java中枚举字段的序列化

翁凯定
2023-03-14

从ObjectInputStream的Javadoc:

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

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

共有1个答案

夹谷承安
2023-03-14

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

如果必须将enum值与状态数据绑定,请使用EnumMap。该类实现了可序列化,因此无需执行任何额外的工作来序列化状态数据(前提是状态数据对象本身是可序列化的)。

 类似资料:
  • 我正在分析SonarQube 5.1版的Java SE 7项目。 然后,我在下面的代码中面对squid:S1948。 “可序列化”类中的字段应该是瞬态的或可序列化的 Serializable类中的字段本身必须是可序列化的或瞬态的,即使该类从未显式序列化或反序列化。这是因为在负载下,大多数J2EE应用程序框架都会将对象刷新到磁盘,并且具有非瞬态、不可序列化数据成员的所谓可序列化对象可能会导致程序崩溃

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • 问题内容: 我们有一个带有枚举字段-的实体,我们想使用JPA注释-为它设置默认值。 但是,当我们将实体保存到数据库时,此字段的值为和。对于布尔字段- 正确的默认值()已保存。 如果改为使用:,则会在保存时得到以下异常: 我们做错了什么?为什么它仅适用于布尔值? 问题答案: 当某些SQL代码在未为emailCommunicationStatus列指定任何值的情况下插入一行时,您所做的工作很有用。在这

  • 我试图在Avro模式中创建Union字段,并用它发送相应的JSON消息,但要有一个字段-。 https://avro.apache.org/docs/1.8.2/spec.html#工会 具有相应JSON数据的最简单联合类型(avro模式)的示例是什么?(尝试制作不含NULL/空数据的示例和含NULL/空数据的示例)。

  • 我在使用SpringData/Hibernate按自定义规则对枚举进行排序时遇到了一些小问题。 A有一个名为DeviceState的枚举,它有自己的优先级字段。 枚举由DeviceEntity使用: 有线索吗,救命?点子?请记住,这是生产工作系统,我不能做任何“烟火”。