2

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

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

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

任何人都可以帮我解释一下吗?只是一个简单的是的,这将起作用,或者不,这不起作用就足够了,任何帮助我学习的链接都会更好!

4

1 回答 1

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,floats 将为 0.0 f,加倍 0.0 等)。

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

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

于 2013-08-11T04:56:42.617 回答