如何保证序列化够稳?
显式定义 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,
就请你当成是同一个版本。”