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