使用ObjectOutputStream写入对象需先用FileOutputStream打开文件,再包装为ObjectOutputStream并调用writeObject();对象必须实现Serializable接口,推荐定义serialVersionUID,transient和静态字段不被序列化。

使用 ObjectOutputStream 将对象写入文件,核心是:先用 FileOutputStream 打开文件输出流,再把它包装成 ObjectOutputStream,最后调用 writeObject() 方法。
对象必须实现 Serializable 接口
这是前提,否则会抛出 NotSerializableException。只需在类声明后加上 implements Serializable 即可:
private String name;
private int age;
// 必须有无参构造器(非强制但推荐)
// getter/setter 和 toString 可选
}
正确创建 ObjectOutputStream 并写入
注意两点:不能直接 new FileOutputStream("xxx.obj") 后调用 writeObject;必须用它构造 ObjectOutputStream;且写完要关闭流(建议 try-with-resources):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
Person p = new Person();
p.setName("张三");
p.setAge(25);
oos.writeObject(p); // 写入对象
} catch (IOException e) {
e.printStackTrace();
}
常见注意事项
-
transient 字段不会被序列化:加了
transient修饰的属性(如密码、临时缓存)会被跳过 - 静态字段不参与序列化:序列化保存的是对象状态,不是类状态
-
serialVersionUID 最好显式定义:避免反序列化时因类结构变化导致 InvalidClassException;可加
private static final long serialVersionUID = 1L; -
父类也要可序列化:如果父类没实现
Serializable,且没有无参构造器,子类序列化可能失败
验证是否成功写入
生成的 .obj 文件是二进制格式,不能直接用文本编辑器看内容。可用以下方式验证:
立即学习“Java免费学习笔记(深入)”;
- 用
ObjectInputStream读取并打印对象,看能否还原 - 用
Files.size(Paths.get("person.obj"))检查文件大小是否大于 0 - 确保没有抛出异常,且程序正常结束

















