我在使用 Serializable 时犯了一个大错误。怎么修?

I did a big mistake using Serializable. How to fix?

我在我的 android 应用程序中实现了可序列化对象以保持向后兼容性。

遗憾的是我创建了我的 classes 是这样的:

Class Foo implements Serializable {
   private static long serialVersionUID = 928374172L;
   [...]
}

我痛苦地发现,Java 无法将此值识别为 serialVersionUID,因为缺少 "final" 语句。

问题是我无法创建 private static final long serialVersionUID 因为已经有一个这样命名的对象... :/

有机会保存这个 class 还是我必须创建一个 Foo2 class 并将所有保存的数据复制到其中?也许有更好的方法?因为我必须在不丢失所有已保存数据的情况下修改此 class。

您当前的 serialVersionUIDstatic,因此它不参与对象的(反)序列化。所以给它加上final是安全的。

如果您的当前值已经不是默认值,请按照 here and here 所述进行更改。

你需要做两件事。

  1. 运行 class 上的 serialver 工具,就像现在一样。 这给了你价值,确实是整个陈述,这是在进行现有序列化时假设的。
  2. 用工具提供的内容替换现有语句,包括关键字 final。这不会破坏任何东西,但它将在未来证明 class 在您对它进行与序列化兼容的更改时不会被破坏,如对象序列化规范的版本控制章节中所述。