使用objectoutputstream写入对象前,类必须实现serializable接口并声明serialversionuid;需用fileoutputstream包装,通过writeobject()写入,推荐try-with-resources管理流;transient字段不参与序列化;注意处理notserializableexception和invalidclassexception。

要用 ObjectOutputStream 把内存中的对象写入文件,核心前提是:该对象所属的类必须实现 Serializable 接口,且整个对象图(包括所有引用的字段)都可序列化。
确保类可序列化
在类定义开头加上 implements Serializable,并建议显式声明 serialVersionUID,避免因编译器自动生成差异导致反序列化失败:
<font size="2">public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 构造方法、getter/setter 省略
}</font>
用 ObjectOutputStream 写入文件
需配合 FileOutputStream 使用,注意按顺序创建流,并在操作完成后关闭:
- 先创建
FileOutputStream指向目标文件路径 - 再用它包装出
ObjectOutputStream - 调用
writeObject()传入对象实例 - 务必
close()两个流(推荐 try-with-resources 自动管理)
<font size="2">try (FileOutputStream fos = new FileOutputStream("person.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
Person p = new Person("Alice", 30);
oos.writeObject(p); // 写入对象
} catch (IOException e) {
e.printStackTrace();
}</font>
注意不可序列化的字段
如果类中包含不能或不应被保存的字段(如数据库连接、线程、临时计算结果),用 transient 修饰:
<font size="2">private transient Thread workerThread; // 不会被写入 private transient int cachedHashCode; // 不会持久化</font>
这些字段在反序列化后为默认值(null、0、false 等)。
常见问题提醒
-
NotSerializableException:某个被引用的对象没实现
Serializable,逐级检查对象图 -
InvalidClassException:类结构变动后未更新
serialVersionUID -
文件是二进制格式:不能直接用文本编辑器查看,需用
ObjectInputStream读取还原 - 多次
writeObject()可写入多个对象,但读取时要按相同顺序调用readObject()










