Java对象序列化需实现Serializable接口并用ObjectOutputStream写入、ObjectInputStream读取;须声明serialVersionUID,所有非transient非静态字段类型必须可序列化,父类未实现则其字段不序列化。

Java 中实现对象序列化,只需让类实现 Serializable 接口,并使用 ObjectOutputStream 将对象写入流(如文件或网络),即可保存对象当前状态;反序列化则用 ObjectInputStream 读取并重建对象。这个接口本身是空的标记接口,不定义任何方法,但它告诉 JVM:这个类的对象允许被序列化。
实现 Serializable 的基本步骤
确保类可序列化,需满足几个关键条件:
- 类必须显式声明
implements Serializable - 推荐手动定义
private static final long serialVersionUID字段(如1L或用 IDE 自动生成),避免因编译器默认生成规则不同导致反序列化失败 - 所有非静态、非瞬态(
transient)字段对应的类型也必须可序列化;否则会抛NotSerializableException - 父类若未实现
Serializable,其字段不会被序列化(除非父类提供无参构造且字段可被子类访问)
保存对象到文件(序列化)
用 ObjectOutputStream 包装一个输出流(比如 FileOutputStream),然后调用 writeObject():
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("person.ser"))) {
Person p = new Person("Alice", 28);
oos.writeObject(p); // 对象状态被写入文件
}
注意:对象必须是可序列化的实例,且流需正确关闭(推荐 try-with-resources)。
立即学习“Java免费学习笔记(深入)”;
从文件恢复对象(反序列化)
用 ObjectInputStream 包装输入流,调用 readObject() 并强制转换为原类型:
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("person.ser"))) {
Person p = (Person) ois.readObject(); // 恢复对象状态
System.out.println(p.getName()); // 输出 Alice
}
注意:readObject() 返回 Object,需显式转型;同时必须捕获 ClassNotFoundException 和 IOException。
控制序列化行为(进阶技巧)
有时你希望跳过某些字段,或自定义序列化逻辑:
- 用
transient修饰字段,该字段不会被序列化(如密码、临时缓存) - 添加
private void writeObject(ObjectOutputStream out)和private void readObject(ObjectInputStream in)方法,可执行自定义序列化流程(例如加密字段、兼容旧版本) - 实现
Externalizable接口可完全接管序列化过程(需重写writeExternal/readExternal),但要求类有无参构造器
不复杂但容易忽略细节,比如忘记加 serialVersionUID 或漏了某个嵌套对象不可序列化——这些都会让程序在运行时突然报错。


















