【问题标题】:why enum are serializable differently in java为什么枚举在java中的序列化方式不同
【发布时间】:2017-12-26 10:19:53
【问题描述】:

有很多关于枚举和序列化的教程,我也在sun看过文章,但找不到如何序列化。

枚举常量的序列化方式与普通的可序列化或可外部化对象不同。枚举常量的序列化形式仅由其名称组成;常量的字段值不存在于表单中。为了序列化枚举常量,ObjectOutputStream 写入枚举常量的 name 方法返回的值。为了反序列化一个枚举常量,ObjectInputStream 从流中读取常量名;然后通过调用 java.lang.Enum.valueOf 方法获得反序列化的常量,将常量的枚举类型与接收到的常量名称一起作为参数传递。

任何例子都会很感激。

【问题讨论】:

  • 您的问题到底是什么?您可以在不添加任何内容的情况下对枚举进行序列化,您尝试过哪些方法不起作用?
  • @Bit 如上所说“枚举常量被序列化不同”这是什么意思。黑白正常序列化然后枚举有什么区别。
  • 我们开始吧,所以您的实际问题是“Java 中的枚举是如何序列化的?”。你可以在这里找到答案stackoverflow.com/a/15522276/6768966。 “我也看了sun的文章,但是不知道怎么连载。”部分具有误导性,看起来你不知道如何,而不是为什么。
  • 我认为他的意思是只有枚举值的名称被序列化和保留。如果您创建一个构造函数,它使用枚举保存任何类型的数据,则该数据不会序列化并且不会保留。

标签: java serialization


【解决方案1】:

所有枚举类型都隐式扩展了已经实现 Serializable 的 java.lang.Enum。因此,您无需采取任何具体行动,它已经为您完成了。

【讨论】:

  • 那么为什么会有关于枚举和序列化的嗡嗡声,正如我所提到的那样。
  • 因为实现是以一种非常有效的方式完成的——人们可能很想编写自己的序列化并包含不必要的东西。因为无论如何你都需要接收端的类,所以除了枚举常量之外不需要包含任何东西。 (您可以将其进一步优化为序数,但插入项目的不同版本的类可能会出现问题......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2013-08-24
相关资源
最近更新 更多