java中用objectinputstream反序列化对象需:1.类实现serializable并声明serialversionuid;2.用try-with-resources包装fileinputstream和objectinputstream;3.捕获ioexception和classnotfoundexception;4.确保文件由objectoutputstream生成且类版本兼容。

Java 中用 ObjectInputStream 从文件反序列化对象,核心是:先用 FileInputStream 打开文件,再套一层 ObjectInputStream,然后调用 readObject()。但必须注意类定义、序列化兼容性和异常处理。
确保目标类可序列化
要反序列化的类必须实现 java.io.Serializable 接口,且推荐显式声明 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 自动关闭流,防止资源泄漏。注意捕获 ClassNotFoundException(类找不到)和 IOException(读取失败):
try (FileInputStream fis = new FileInputStream("person.ser");
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 写出的二进制格式文件,且反序列化时类路径下必须存在对应类的字节码(.class 文件),版本需兼容。常见问题包括:
- 运行时抛
ClassNotFoundException→ 检查类是否在 classpath 中,包名是否完全一致 - 抛
InvalidClassException→ 对比序列化时与当前类的serialVersionUID,或确认字段增删/类型变更是否被允许 - 抛
StreamCorruptedException→ 文件可能被损坏、不是合法的序列化输出,或被文本编辑器误打开保存过
不支持直接读多个对象?需要循环处理
如果文件中连续写入了多个对象(例如多次 writeObject()),可以循环调用 readObject(),直到抛出 EOFException(正常结束信号):
try (FileInputStream fis = new FileInputStream("people.ser");
ObjectInputStream ois = new ObjectInputStream(fis)) {
while (true) {
try {
Person p = (Person) ois.readObject();
System.out.println(p);
} catch (EOFException e) {
break; // 到达文件末尾,退出
}
}
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











