Java中序列化Object基类属性的核心是确保待传输对象及其所有字段(含继承链中可序列化成员)满足Serializable契约:必须显式实现该接口,正确处理transient/static字段,父类也需可序列化或手动处理,避免引用不可序列化类型,并显式声明serialVersionUID保障版本兼容性。

必须显式实现 Serializable 接口
哪怕只继承 `Object`(所有类默认如此),也必须主动声明:public class MyData implements Serializable。仅靠继承无法获得序列化能力。JVM 仅凭该标记接口决定是否允许 `ObjectOutputStream` 处理该实例。
注意非序列化字段:transient 和 static
以下两类字段默认不参与序列化,即使它们是 `Object` 类型或其子类:
-
被
transient修饰的字段:例如private transient Object cache;—— 反序列化后为null -
static字段:属于类而非实例,不随对象状态保存,如private static Object config;—— 序列化时完全忽略
处理父类字段:父类也得可序列化
如果 `MyData extends BaseClass`,而 `BaseClass` 没实现 `Serializable`,那么 `BaseClass` 中定义的实例字段(哪怕类型是 `Object`)将无法被序列化,反序列化时这些字段值为默认值(如 `null`、`0`、`false`)。解决方式有两种:
- 让父类也实现
Serializable(推荐) - 若无法修改父类,则子类需提供自定义序列化逻辑(重写
writeObject/readObject),手动保存/恢复父类字段
避免引用不可序列化对象
即使你的类实现了 `Serializable`,只要某个字段是不可序列化的类型(如 `Thread`、`Socket`、未实现 `Serializable` 的第三方类),序列化时就会抛出 NotSerializableException。常见陷阱包括:
立即学习“Java免费学习笔记(深入)”;
- 持有
java.util.Date✅(可序列化) - 持有
java.time.LocalDateTime❌(Java 8+ 默认不可序列化,需用 `@Serial` 或转为 `Instant` + 时区信息) - 字段类型为匿名内部类或 Lambda 表达式实例 ❌(捕获了外部不可序列化上下文)
显式声明 serialVersionUID
添加 private static final long serialVersionUID = 1L; 是强约定。否则 JVM 自动生成的 UID 易受类结构微小变更(如加个字段、改访问修饰符)影响,导致反序列化失败:InvalidClassException。尤其在分布式多版本共存场景下,这是稳定性刚需。


















