java中序列化对象需实现serializable接口并声明serialversionuid,transient字段不参与序列化;用objectoutputstream配合fileoutputstream调用writeobject()保存对象,注意兼容性、大对象及敏感数据处理。

Java 中使用 ObjectOutputStream 保存对象状态,核心是让类实现 Serializable 接口,并通过输出流将对象写入文件或网络通道。
对象必须可序列化
只有实现了 java.io.Serializable 接口的类,其对象才能被 ObjectOutputStream 序列化。这个接口是标记接口,无需定义任何方法:
- 在类声明中添加
implements Serializable - 建议显式声明
private static final long serialVersionUID = 1L;,避免反序列化时因类版本不一致报错 - 被
transient修饰的字段不会被序列化(例如临时计算值、敏感信息)
用 ObjectOutputStream 写入对象到文件
需要配合 FileOutputStream 构建对象输出流,再调用 writeObject() 方法:
- 确保目标文件路径可写,且父目录已存在
- 每个
writeObject()调用会完整写入一个对象,支持连续写入多个对象 - 记得调用
close()或使用 try-with-resources 自动释放资源
示例代码片段:
try (FileOutputStream fos = new FileOutputStream("user.dat");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
User user = new User("Alice", 28);
oos.writeObject(user); // 保存对象
}
注意序列化兼容性与限制
不是所有对象都能直接序列化:
- 包含不可序列化字段(如未实现
Serializable的自定义类)会抛NotSerializableException - 静态字段和构造器、方法本身不参与序列化,只保存实例字段的值
- 若类继承自不可序列化的父类,父类部分字段不会被保存;父类需也实现
Serializable,或提供无参构造器供反序列化重建
常见问题处理建议
实际开发中容易踩坑的地方:
- 修改类结构(如增删字段)后,旧序列化数据可能无法反序列化 —— 始终维护稳定的
serialVersionUID - 避免序列化大对象或含循环引用的对象,可能导致栈溢出或内存溢出
- 敏感字段(如密码)务必用
transient修饰,或重写writeObject/readObject实现自定义序列化逻辑
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











