子类自动可序列化当父类实现Serializable,但父子类须各自显式定义不重复的serialVersionUID;父类未实现时其字段不序列化,需手动处理;嵌套对象也须逐层实现Serializable。

父类实现 Serializable,子类自动可序列化
只要父类声明了 implements Serializable,子类无论是否显式写这个接口,都具备序列化能力。JVM 在运行时会沿继承链向上检查,一旦发现任意祖先类实现了该接口,就认为整个对象可被序列化。子类新增的字段(如 int d, String name)也会被默认包含在序列化数据中,无需额外操作。
父子类都要独立管理 serialVersionUID
serialVersionUID 不继承、不共享,必须各自显式定义:
- 父类应固定声明
private static final long serialVersionUID = 1L;(推荐从 1 开始,后续按自身演进递增) - 子类即使没加新字段,也必须定义自己的 UID,例如
private static final long serialVersionUID = 2L; - 不能省略子类 UID,也不能复制父类的值——否则反序列化时会因“UID 不匹配”失败
- 若父类结构变更(如删字段、改类型),只影响父类 UID;子类修改自身字段,只更新子类 UID
父类未实现 Serializable 的情况要特别处理
此时父类字段完全不参与序列化,反序列化时靠调用其无参构造器初始化,所有字段变为默认值(null、0、false):
- 最稳妥做法:让父类实现
Serializable并加上自己的serialVersionUID - 若父类不可改(如第三方类),子类需重写
writeObject和readObject方法,在其中手动读写父类字段 - 手动方式要求父类必须有可访问的无参构造器,否则反序列化直接抛异常
嵌套对象也要逐层实现 Serializable
如果子类字段引用了其他对象(比如 Address addr),那么 Address 类也必须实现 Serializable,并同样声明自己的 serialVersionUID。JVM 不会因为外层可序列化,就自动让内层对象“沾光”。任何一级缺失,都会在序列化时抛 NotSerializableException。
立即学习“Java免费学习笔记(深入)”;


















