面试题答案
一键面试可能遇到的问题
当修改了对象所属类的结构(如添加新字段)再进行反序列化时,可能会抛出 InvalidClassException
异常。这是因为反序列化过程中,Java 会对比序列化对象中的 serialVersionUID
与当前类中的 serialVersionUID
。如果类结构改变,默认生成的 serialVersionUID
也会改变,两者不一致就会导致该异常,反序列化失败。
通过序列化版本号(serialVersionUID)解决问题的方法
- 显式定义 serialVersionUID:在类中显式声明一个
private static final long serialVersionUID
变量,并赋予其一个固定的值。例如:
public class MyClass implements Serializable {
private static final long serialVersionUID = 1L;
// 类的其他成员和方法
private String oldField;
private int newField; // 新增字段
}
这样,即使类结构发生改变(如添加新字段),只要 serialVersionUID
值不变,在反序列化时就不会因为版本不一致而抛出 InvalidClassException
异常。在反序列化时,新添加的字段如果没有在序列化数据中找到对应值,会使用其默认值(如 int
类型为 0,String
类型为 null
等)。
- 保持 serialVersionUID 一致性:在类的后续维护和演进过程中,如果只是进行兼容的修改(如添加新字段),不要修改
serialVersionUID
的值。只有在进行不兼容的修改(如删除字段、改变字段类型等可能导致反序列化数据无法正确恢复对象状态的修改)时,才考虑修改serialVersionUID
的值,并且要同时更新所有相关的序列化数据,或者提供特殊的迁移逻辑来处理旧版本数据的反序列化。