【问题标题】:How can I have more flexible serialization and deserialization in Java?如何在 Java 中进行更灵活的序列化和反序列化?
【发布时间】:2010-07-19 20:28:56
【问题描述】:

如果我在Java中序列化一个对象,然后在java类中添加一个额外的字段,我无法将对象反序列化到修改后的类中。

是否有序列化库或某种方式可以让反序列化不那么严格,例如如果在类中添加了一个额外的字段,那么在反序列化旧版本的类时它只是用 null 填充?

【问题讨论】:

  • 你不需要java的序列化。查看一些简单的 xml/json 序列化库。
  • 序列化的 Java 对象有一个巨大的缺点是不可读,除非你再次反序列化它们。使用基于文本的格式,如 xml 或 json 使内容可读,并且使序列化方式更可定制(即您的版本问题)

标签: java serialization


【解决方案1】:

您需要在课堂上保留serialVersionUID。查看this article by Sun 中的“版本控制”部分。

【讨论】:

【解决方案2】:

你有很多潜在的选择。

您可以使用图形序列化库来定义和管理您的格式,例如谷歌的protocol buffersKryo。我相信这两个都内置了对版本控制的支持。

您可以编写自己的自定义序列化代码并显式处理版本 - 例如序列化为像 XML 这样的灵活格式。读取 XML 时,如果未指定特定字段,您可以将其配置为使用默认值。

或者您可以以“灵活”的方式设计您的课程,例如将所有字段存储在 HashMap 中并由字符串索引。根据您要执行的操作,这可能是一个方便的选择。

【讨论】:

  • 我认为 JSON 会是比 XML 更好的序列化格式,但代价是需要一个 JSON 库。
  • @W.Craig - 是的,我同意,JSON 也是一个不错的选择。
  • @W.Craig - 你也会为 xml lib 付出那样的代价 - 我不建议任何人自己解析 xml。如果是 Xml:使用 JAXB。更少的开销:JSON。
  • @f1sh,使用 Java,您已经将 XML 库作为运行时的一部分;您需要添加 JSON 库(诚然,它比等效的 XML 更小/更快)。
【解决方案3】:

有相当多的序列化库,不过看看 Simple:

http://simple.sourceforge.net/

或如上所述的 Google 协议缓冲区。

http://code.google.com/apis/protocolbuffers/

【讨论】:

    【解决方案4】:

    实施Externalizable,您可以为所欲为。将序列化/反序列化的责任完全放在被序列化的类身上。

    【讨论】:

      【解决方案5】:

      您是否添加了 serialVersionUID?如果你想序列化/反序列化一个类的不同版本,这必须存在(并且不变)。

      此外,您可以将以下两种方法添加到您的类中以准确定义序列化过程:

      private void writeObject(java.io.ObjectOutputStream stream)
       throws IOException;
      private void readObject(java.io.ObjectInputStream stream)
       throws IOException, ClassNotFoundException; 
      

      ObjectInputStream 的 Javadoc 提供了有关其用法的更多详细信息。

      【讨论】:

        【解决方案6】:

        如果我在 Java 中序列化一个对象,并且 然后稍后添加一个额外的字段 java类,我不能反序列化 对象放入修改后的类中。

        首先这是不正确的。在继续之前,您需要仔细查看对象序列化规范的版本控制部分。

        【讨论】:

          猜你喜欢
          • 2013-07-11
          • 2012-12-19
          • 2013-01-08
          • 2021-04-22
          • 2011-08-17
          • 1970-01-01
          • 2019-03-17
          相关资源
          最近更新 更多