Java反序列化需用ObjectInputStream包装FileInputStream并调用readObject(),类必须实现Serializable接口且建议显式声明serialVersionUID;推荐try-with-resources管理资源,并捕获IOException、ClassNotFoundException等异常;多对象需循环读取并以EOFException为结束标志。

Java 中使用 ObjectInputStream 从文件反序列化对象,核心是:先用 FileInputStream 打开文件,再将其包装为 ObjectInputStream,然后调用 readObject() 方法。但必须确保对象类实现了 Serializable 接口,且文件中确实存有合法的序列化字节流。
确保目标类可序列化
被反序列化的类必须实现 java.io.Serializable 接口,否则运行时抛出 NotSerializableException。建议显式声明 serialVersionUID,避免因类结构变动导致 InvalidClassException:
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
// 构造方法、getter/setter 省略
}
用 try-with-resources 安全读取
推荐使用 try-with-resources 自动关闭流,防止资源泄漏。注意捕获常见异常:IOException(文件不存在、损坏等)、ClassNotFoundException(反序列化时找不到类定义):
try (FileInputStream fis = new FileInputStream("person.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
Person p = (Person) ois.readObject();
System.out.println(p.getName() + ", " + p.getAge());
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
} catch (ClassNotFoundException e) {
System.err.println("类未找到: " + e.getMessage());
}
注意序列化数据的完整性
ObjectInputStream 读取的是完整对象图,要求文件内容必须是由 ObjectOutputStream 写入的合法序列化数据。常见问题包括:
立即学习“Java免费学习笔记(深入)”;
- 文件为空或被其他程序修改过 → 抛出
StreamCorruptedException - 多次写入多个对象到同一文件,但只调用一次
readObject()→ 只能读第一个对象;需循环读取直到抛出EOFException - 反序列化时类路径中没有对应 class 文件,或版本不匹配 →
ClassNotFoundException或InvalidClassException
处理多个对象连续序列化的情况
如果文件中按顺序写入了多个对象(例如用 writeObject() 多次),反序列化时需循环调用 readObject(),并捕获 EOFException 作为结束信号:
try (FileInputStream fis = new FileInputStream("people.dat");
ObjectInputStream ois = new ObjectInputStream(fis)) {
while (true) {
try {
Person p = (Person) ois.readObject();
System.out.println("读到: " + p.getName());
} catch (EOFException e) {
break; // 到达文件末尾
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}


















