【问题标题】:Java Serialized Class Saved To File - How can i ensure backwards compatibility?Java 序列化类保存到文件 - 我如何确保向后兼容性?
【发布时间】:2013-08-11 23:07:26
【问题描述】:

我编写了一个 Android 应用程序,用于生成“摄影服务”合同并将其作为文件保存到设备中以供以后打印。该类几乎由整数、双精度数和字符串(包括 base64_encoded 签名)组成。

该类实现可序列化。但是,我担心我更新应用程序,忘记不编辑类并编辑它,重新加载到我的设备上并将 X 数量的合同保存到一个文件中,然后无法检索它们。

之前我浏览并找到了serialVersionUID。在一篇文章中,我只是通过实现这个简单的 long 值来阅读,如果我更新类,它仍然可以被读取。它是否正确?我阅读了 Serializable 的 java 文档,无法对实现 serialVersionUID 的结果做出太多决定。

谁能帮我解释一下这个问题? 只需一个简单的“是”,这将起作用,或者“否”,这不会起作用就足够了,任何帮助我学习的链接都会更好!

【问题讨论】:

  • 简短回答:你不能。这不是 Java 中序列化的工作方式(或者它的真正含义)。您可能想要使用 JSON 或其他更动态和更宽容的序列化方案/库。
  • 如果向后兼容性绝对重要,请使用其他机制。
  • 简短的回答,您可以,但是您确实需要非常仔细地阅读对象序列化规范的版本控制章节,并在您的更改中保持在这些范围内。

标签: java serialization serialversionuid


【解决方案1】:

要获得与序列化的向后兼容性,您必须

  1. 对于要在整个版本中序列化的类具有相同的 serialVersionUID。
  2. 您可以根据需要添加/删除类方法,不会影响序列化。
  3. 您可以根据需要添加任意数量的新成员,并且在用户将应用程序更新到新版本后,他们将立即具有其类型的默认值。

例子:

// Old format
class FileFormat implements Serializable {
   static final long serialVersionUID = 44L;

   public String member1;
}

...
// New format
class FileFormat implements Serializable {
   static final long serialVersionUID = 44L;

   public String member1;
   public int member2;
}

在上面,用户第一次使用新应用程序读取使用旧 FileFormat 序列化的文件时,她/他将获得一个新格式 FileFormat 对象,其中 member2 设置为 0。(Strings/Objects 将为 null,浮动将是 0.0f,双倍 0.0 等)。

  1. 不能从类中删除任何字段(您将失去向后兼容性)
  2. 不能通过向上或向下移动类的方式更改类的层次结构

还有很多其他的限制,查看官方文档: http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2011-07-19
    • 1970-01-01
    • 2018-05-16
    • 2022-11-11
    相关资源
    最近更新 更多