java 如何反序列化
反序列化基础概念
反序列化是将字节流或文件中的数据转换回Java对象的过程,与序列化(对象→字节流)相反。Java通过ObjectInputStream实现反序列化,需确保对象类实现Serializable接口。

实现反序列化的步骤
创建ObjectInputStream对象
通过输入流(如文件流、网络流)初始化ObjectInputStream:

FileInputStream fileIn = new FileInputStream("object.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
读取反序列化对象
使用readObject()方法获取对象,需强制转换为目标类型:
MyClass obj = (MyClass) in.readObject();
关闭资源
操作完成后关闭流以释放资源:
in.close();
fileIn.close();
完整代码示例
import java.io.*;
public class DeserializeExample {
public static void main(String[] args) {
try {
FileInputStream fileIn = new FileInputStream("employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Employee emp = (Employee) in.readObject();
in.close();
fileIn.close();
System.out.println("反序列化成功: " + emp.getName());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
class Employee implements Serializable {
private String name;
public String getName() { return name; }
}
注意事项
- 类一致性:反序列化的类必须与序列化时完全一致(包名、类名、字段),否则抛出
InvalidClassException。 - 安全风险:反序列化可能执行恶意代码,需验证输入源或使用白名单机制。
- 版本控制:通过
serialVersionUID显式声明版本号,避免类变更导致的兼容性问题:private static final long serialVersionUID = 1L;
处理异常情况
ClassNotFoundException:类路径中缺少目标类。InvalidClassException:类结构不匹配或未实现Serializable。StreamCorruptedException:数据流被篡改或损坏。
进阶用法
- 自定义反序列化逻辑:通过实现
readObject()方法控制过程:private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); // 默认反序列化 // 自定义逻辑 } - 外部化处理:若需更细粒度控制,可改用
Externalizable接口并实现readExternal()方法。
通过以上步骤,可安全高效地完成Java对象的反序列化操作。






