跳转到内容

如何保证序列化够稳?


显式定义 serialVersionUID,相当于给类打个版本戳,防止改了类结构后反复序列化旧数据时报错。

不写 serialVersionUID 会发生什么?

如果没显式写

class User implements Serializable {
private String name;
}

Java 会在运行时 根据类结构自动算一个 UID,算法和下面这些有关:

  • 类名

  • 实现的接口

  • 字段数量 / 类型

  • 方法签名

  • 甚至 private 字段

然后问题来了

改了一点点代码,比如:

private int age;

哪怕只是 加了一个字段

  • 旧数据:用“旧结构”序列化的

  • 新代码:用“新结构”反序列化

  • Java 发现:“咦?算出来的 UID 不一样!”

于是直接抛异常:

java.io.InvalidClassException

显式定义 serialVersionUID 到底解决了什么?

主动告诉 Java:这个类的“版本标识”是多少,而不是让它乱算

class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
}

这就等于在说:

“不管我内部怎么小改,只要我没手动改 serialVersionUID,
就请你当成是同一个版本。”