Java序列化类保存到文件 - 如何确保向后兼容性?

时间:2013-08-09 22:17:08

标签: java serialization serialversionuid

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

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

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

任何人都可以帮我解决这个问题吗? 只是一个简单的是,这将工作或没有这不会工作是足够的,任何帮助我学习的链接将更好!

1 个答案:

答案 0 :(得分:1)

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

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

    // 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.(字符串/对象将为null,浮动将是0.0f,双倍0.0等。)。

    1. 无法从班级中删除任何字段(您将失去向后兼容性)
    2. 无法通过向上或向下移动课程来更改班级的层次结构
    3. 还有很多其他限制,请查看官方文件: http://docs.oracle.com/javase/6/docs/platform/serialization/spec/version.html