父类未实现serializable时,其字段不会被序列化,反序列化时通过无参构造器重建并初始化为默认值;补救方式包括让父类实现serializable或子类重写writeobject/readobject方法。

父类没实现 Serializable,子类单独实现,父类字段不会被序列化——这是 Java 序列化的硬性规则。反序列化时,父类部分靠无参构造器重建,字段全变成默认值(null、0、false),不是“丢失”,而是根本没写进去。
父类字段不参与序列化是默认行为
Java 序列化只处理显式声明 implements Serializable 的类所定义的字段。哪怕继承链再深,只要某一级父类没实现该接口,它声明的所有实例字段(包括泛型字段如 ID id)都会被跳过:
- 不写入字节流
- 不在反序列化时恢复
- 子类字段照常保存,但父类字段状态彻底清零
补救方式一:让父类实现 Serializable(推荐)
如果父类代码可修改,这是最干净、最安全的做法:
- 给父类加上 implements Serializable
- 显式声明 private static final long serialVersionUID
- 泛型类(如 Entity<id></id>)无需额外处理,字段自动纳入序列化范围
- 子类保持原有实现,无需改动逻辑或增加手动读写
补救方式二:子类自定义 writeObject/readObject
当父类来自第三方库、无法修改时,子类可通过重写两个私有方法接管父类字段:
- writeObject 中先调用 defaultWriteObject(),再用 out.writeXXX() 显式写出父类字段
- readObject 中先调用 defaultReadObject(),再用 in.readXXX() 逐个读回并赋值给父类字段
- 前提是父类必须有可访问的无参构造器,否则反序列化直接失败
继承链中任意一级中断都会影响字段传递
序列化不是“继承能力”,而是逐类检查契约:
- A → B → C,仅 C 实现 Serializable:只有 C 的字段保留,A 和 B 全部丢失
- A → B → C,A 和 C 实现,B 没实现:A 的字段能保留(因 A 自身可序列化),B 的字段丢失,C 的字段保留
- 只要中间某级不可序列化且不可改,就得由最近的可修改子类兜底处理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











