我在使用 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。
您当前的 serialVersionUID
是 static
,因此它不参与对象的(反)序列化。所以给它加上final
是安全的。
如果您的当前值已经不是默认值,请按照 here and here 所述进行更改。
你需要做两件事。
- 运行 class 上的
serialver
工具,就像现在一样。 这给了你价值,确实是整个陈述,这是在进行现有序列化时假设的。
- 用工具提供的内容替换现有语句,包括关键字
final
。这不会破坏任何东西,但它将在未来证明 class 在您对它进行与序列化兼容的更改时不会被破坏,如对象序列化规范的版本控制章节中所述。
我在我的 android 应用程序中实现了可序列化对象以保持向后兼容性。
遗憾的是我创建了我的 classes 是这样的:
Class Foo implements Serializable {
private static long serialVersionUID = 928374172L;
[...]
}
我痛苦地发现,Java 无法将此值识别为 serialVersionUID,因为缺少 "final" 语句。
问题是我无法创建 private static final long serialVersionUID
因为已经有一个这样命名的对象... :/
有机会保存这个 class 还是我必须创建一个 Foo2
class 并将所有保存的数据复制到其中?也许有更好的方法?因为我必须在不丢失所有已保存数据的情况下修改此 class。
您当前的 serialVersionUID
是 static
,因此它不参与对象的(反)序列化。所以给它加上final
是安全的。
如果您的当前值已经不是默认值,请按照 here and here 所述进行更改。
你需要做两件事。
- 运行 class 上的
serialver
工具,就像现在一样。 这给了你价值,确实是整个陈述,这是在进行现有序列化时假设的。 - 用工具提供的内容替换现有语句,包括关键字
final
。这不会破坏任何东西,但它将在未来证明 class 在您对它进行与序列化兼容的更改时不会被破坏,如对象序列化规范的版本控制章节中所述。