Java中序列化对象需实现Serializable接口并声明serialVersionUID,通过FileOutputStream包装ObjectOutputStream调用writeObject写入,注意处理IOException、NotSerializableException和InvalidClassException,transient和静态字段不参与序列化。

Java 中使用 ObjectOutputStream 将对象写入文件,核心是让对象实现 Serializable 接口,并通过输出流完成序列化操作。注意:不是所有对象都能直接写入,必须可序列化,且涉及的字段(包括嵌套对象)也需满足要求。
确保类实现 Serializable 接口
要被 ObjectOutputStream 序列化的类,必须显式实现 java.io.Serializable 接口(空接口,仅作标记)。建议显式声明 serialVersionUID,避免因类结构变化导致反序列化失败:
- 不加
serialVersionUID时,JVM 会根据类结构自动生成,一旦字段增删或类型变更,ID 改变,读取旧文件会抛InvalidClassException - 推荐写法:private static final long serialVersionUID = 1L;(数值可按需自定义)
用 FileOutputStream 包装 ObjectOutputStream
ObjectOutputStream 不能直接操作文件,必须套在 FileOutputStream 上。典型写法如下:
- 先创建
FileOutputStream指向目标文件路径(如"data.obj") - 再用它构造
ObjectOutputStream - 调用
writeObject(obj)写入对象(支持任意可序列化对象,包括集合、自定义类实例等) -
务必调用
close()或flush(),否则数据可能未真正写入磁盘
处理常见异常和注意事项
序列化过程可能抛出三种检查异常,需捕获或声明:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
-
IOException:文件不可写、磁盘满、路径错误等 I/O 问题 -
NotSerializableException:尝试写入未实现Serializable的对象(含其某个字段) -
InvalidClassException:serialVersionUID不匹配或类结构不兼容 - 静态字段和用
transient修饰的字段不会被序列化,写入时自动跳过
完整示例代码
假设有一个用户类:
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String password; // 不会被保存
// 构造方法、getter/setter 略
}
写入文件代码:
try (FileOutputStream fos = new FileOutputStream("user.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos)) {
User user = new User("Alice", 30);
oos.writeObject(user);
} catch (IOException e) {
e.printStackTrace();
}

















