objectoutputstream写入对象需类实现serializable接口并用其包装fileoutputstream;示例person类需声明serialversionuid,通过try-with-resources写入person.dat文件,不可序列化字段用transient修饰,静态成员不参与序列化。

用 ObjectOutputStream 把对象写入文件,核心是:对象必须实现 Serializable 接口,再通过输出流包装文件流完成序列化写入。
对象必须可序列化
只有实现了 java.io.Serializable 接口的类,其对象才能被 ObjectOutputStream 序列化。接口本身是空标记接口,不需实现方法,但建议显式声明 serialVersionUID 避免版本兼容问题:
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 构造方法、getter/setter 省略
}
用 ObjectOutputStream 包装 FileOutputStream
ObjectOutputStream 不能直接操作文件,必须套在 FileOutputStream 之上。注意要先创建文件流,再传给对象输出流:
- 使用 try-with-resources 自动关闭流(推荐)
- 捕获
IOException和ClassNotFoundException(反序列化时才需要后者) - 写入后无需手动 flush(),close() 会自动完成
Person p = new Person("Alice", 28);
try (FileOutputStream fos = new FileOutputStream("person.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
oos.writeObject(p); // 一行即可写入对象
} catch (IOException e) {
e.printStackTrace();
}
注意事项和常见问题
序列化不是万能的,以下情况会导致失败或数据异常:
- 对象中包含不可序列化的字段(如
Thread、Socket),应加transient修饰跳过 - 静态字段(
static)和构造器、方法不会被序列化,只保存实例状态 - 父类未实现
Serializable,且无无参构造器时,子类序列化可能抛NotSerializableException - 文件是二进制格式,不能用文本编辑器直接查看,需用
ObjectInputStream读取
验证是否成功写入
最简单的方式是立即反序列化读回,看能否还原原对象:
try (FileInputStream fis = new FileInputStream("person.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
Person loaded = (Person) ois.readObject();
System.out.println(loaded.getName()); // 输出 Alice
}
如果读取正常,说明写入成功。注意读取时类定义需与写入时一致(尤其是 serialVersionUID)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











