直接实现Serializable接口即可启用Java默认序列化机制,自动保存非静态、非瞬态且类型可序列化的字段;需显式声明serialVersionUID,使用ObjectOutputStream/ObjectInputStream操作,并注意父类、集合元素及transient字段等限制。

直接让类实现 Serializable 接口,就能启用 Java 的默认序列化机制。它会自动保存对象的非静态、非瞬态字段,反序列化时按原结构重建对象——前提是类定义稳定、运行环境一致。
类必须显式实现 Serializable 接口
这是一个空标记接口,不提供任何方法,仅用于告知 JVM 该类支持序列化:
- 不实现会抛出 NotSerializableException
- 推荐始终声明
private static final long serialVersionUID = 1L;,避免因类结构微调(如新增字段)导致反序列化失败 - 若未显式声明,JVM 会根据类名、字段、方法等生成一个运行时 ID,但不同编译器或版本可能生成不同值,引发兼容问题
哪些字段会被默认序列化
默认规则下,只有满足以下条件的字段才会被写入字节流:
- 非
static:静态字段属于类,不属于实例,不参与序列化 - 非
transient:用transient修饰的字段(如密码、临时缓存)会被跳过 - 字段类型本身可序列化:如果某个引用类型字段(如自定义类)未实现 Serializable,也会报错
用 ObjectOutputStream 和 ObjectInputStream 完成操作
序列化和反序列化需配合对应的流类,且必须处理两个关键异常:IOException 和 ClassNotFoundException(反序列化时找不到类定义):
立即学习“Java免费学习笔记(深入)”;
-
序列化:创建
ObjectOutputStream包装底层输出流(如FileOutputStream),调用writeObject(obj) -
反序列化:创建
ObjectInputStream包装底层输入流(如FileInputStream),调用readObject()并强制转为目标类型 - 注意:反序列化得到的是新对象,与原对象内存地址不同,但字段值一致
常见陷阱与注意事项
看似简单,但实际使用中容易忽略几个关键点:
- 父类未实现 Serializable 时,其字段不会被序列化(除非父类也实现了)
- 集合类(如
ArrayList、HashMap)本身已实现接口,内部元素仍需各自可序列化 - 反序列化时,类的无参构造函数不会被调用;JVM 直接分配内存并填充字段值
- 敏感字段务必用
transient修饰,或通过自定义writeObject/readObject方法加密


















