父类未实现Serializable时,其字段不会被序列化,反序列化时JVM调用父类无参构造器初始化为默认值;子类需确保父类有可访问无参构造器,或通过重写writeObject/readObject手动处理父类字段。

父类没实现 Serializable,子类单独实现后,父类字段不会被序列化——这是 Java 序列化的硬性规则。反序列化时,JVM 会调用父类的无参构造器重建父类部分,所有字段都变成默认值(null、0、false),不是“丢失”,而是压根没写进字节流。
父类字段不参与序列化是默认行为
Java 序列化只处理显式声明 implements Serializable 的类所定义的字段。哪怕继承链再深,只要某一级父类没实现该接口,它声明的所有实例字段(包括泛型字段如 ID id)都会被跳过:
- 不写入字节流
- 不在反序列化时恢复
- 子类字段照常保存,但父类字段状态彻底清零
必须保证父类有可访问的无参构造器
否则反序列化直接失败,抛出 InvalidClassException 或 NoSuchMethodException。这个限制与序列化逻辑无关,纯粹是 JVM 重建父类对象的必要条件:
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
- 父类需有
public、protected或包级可见的无参构造器 - 如果父类只定义了带参构造器,又没显式声明无参构造器,就必须补上一个
- 子类自己的构造器在反序列化中完全不执行
补救方式一:让父类实现 Serializable(推荐)
如果父类代码可控,这是最干净、最安全的做法:
立即学习“Java免费学习笔记(深入)”;
- 给父类加上
implements Serializable - 显式声明
private static final long serialVersionUID - 泛型类(如
Entity<id></id>)无需额外处理,字段自动纳入序列化范围 - 子类保持原有实现,无需改动逻辑或增加手动读写
补救方式二:子类重写 writeObject 和 readObject
当父类来自第三方库、无法修改时,子类可通过两个私有方法接管父类字段:
-
writeObject中先调用defaultWriteObject(),再用out.writeXXX()显式写出父类字段 -
readObject中先调用defaultReadObject(),再用in.readXXX()逐个读回并赋值给父类字段 - 前提仍是父类必须有可访问的无参构造器
- 注意字段访问权限:若父类字段为
private,需通过 getter/setter 或反射间接操作

















