面试题答案
一键面试保持 serialVersionUID 不变
- 原理:
- Java 的序列化机制通过 serialVersionUID 来验证序列化对象和反序列化对象是否兼容。当 serialVersionUID 相同时,Java 虚拟机(JVM)会尝试反序列化对象。
- 对于字段的添加,如果反序列化的字节流中没有对应新添加字段的值,JVM 会使用该字段的默认值来初始化。例如,如果新添加的字段是
int
类型,会初始化为 0;如果是Object
类型,会初始化为null
。 - 对于字段的删除,JVM 会忽略字节流中对应已删除字段的值,按照当前类的结构进行反序列化。
- 可能出现的结果:
- 反序列化过程通常可以成功完成,因为 JVM 认为序列化对象和当前类结构在版本上是兼容的。
- 对于新添加的字段,反序列化后对象的这些字段将具有默认值,可能需要在反序列化后进行额外的处理来赋予合适的值。
- 对于删除的字段,反序列化后对象不再包含这些字段的数据,不会出现数据错误,但如果程序逻辑依赖于这些已删除字段的数据,可能会导致逻辑错误。
改变 serialVersionUID
- 原理:
- 当 serialVersionUID 改变时,JVM 会认为序列化对象和当前类是不兼容的版本。因为 serialVersionUID 是序列化机制中用于标识类版本的关键标识符,不同的 serialVersionUID 意味着类结构发生了重大变化。
- 在反序列化时,JVM 会将字节流中的 serialVersionUID 与当前类的 serialVersionUID 进行比较,若两者不相等,反序列化将失败。
- 可能出现的结果:
- 反序列化过程会抛出
InvalidClassException
,提示类版本不兼容。这表明当前类与序列化时的类结构差异过大,无法进行反序列化。 - 程序必须进行相应的处理,比如重新序列化数据以匹配新的类结构,或者修改反序列化逻辑来处理不同版本的类,否则无法正常恢复对象。
- 反序列化过程会抛出