【发布时间】:2018-08-09 22:49:20
【问题描述】:
根据此处对 SerialVersionUID 的描述:https://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100,似乎有必要在您创建的任何类中始终包含 SerialVersionUID,以便用于序列化的 JVM 和用于反序列化的不同 JVM 不会自动分配它们自己的 SerialVersionUID,由于JVM的差异,它们有可能彼此不同。这对于控制我自己的类的反序列化效果很好,但是如果我想确保标准库中用 JVM A 序列化的类可以被 JVM B 反序列化怎么办?
Map<Integer, String> myMap = new HashMap<>();
HashMap 定义了一个 SerialVersionUID。但是:
- 既然 HashMap 存在于 java 标准库中,我是否提供了任何形式的保证,如果我用 JVM A 序列化这个 HashMap,JVM B 将能够反序列化它?也就是说,是否允许 JVM B 指定与 JVM A 不同的 SerialVersionUID,至少如果 B 只是从 A 升级的次要版本?
-
如果标准库类不能保证,那么使用 SerialVersionUID 是否真的只能确保您自己的类从不接触 java 标准库的正确反序列化?例如,一个如下所示的类:
public class NewClass implements Serializable { private static final long serialVersionUID = 1L; private final Map<Integer, String> myMap; public NewClass() { this.myMap = new HashMap<>(); } }很容易失败,因为反序列化依赖于具有相同 SerialVersionUID 的 HashMap,这在不同的 JVM 中可能会有所不同,对吧?
【问题讨论】:
标签: java serialization serialversionuid