如何在 Java 中进行反序列化?
·
我用最清晰、最实用、可直接运行的方式,教你Java 反序列化到底怎么写、怎么用、注意什么。
一、什么是反序列化?
把字节流(文件/网络数据) 重新变回 Java 对象的过程。
需要两个核心类:
FileInputStream:读取字节数据ObjectInputStream:把字节还原为对象
二、反序列化 完整步骤 + 代码
1. 前提:类必须实现 Serializable
import java.io.Serializable;
public class User implements Serializable {
// 必须加,否则改类就无法反序列化
private static final long serialVersionUID = 1L;
private String name;
private int age;
private transient String password; // 不会被序列化
// getter、setter、toString
}
2. 反序列化代码(直接复制就能用)
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class DeserializeDemo {
public static void main(String[] args) {
try (
FileInputStream fis = new FileInputStream("user.obj");
ObjectInputStream ois = new ObjectInputStream(fis)
) {
// 核心:反序列化
User user = (User) ois.readObject();
System.out.println("反序列化成功!");
System.out.println("姓名:" + user.getName());
System.out.println("年龄:" + user.getAge());
System.out.println("密码:" + user.getPassword()); // null(transient)
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、反序列化 执行结果
反序列化成功!
姓名:张三
年龄:20
密码:null
password是transient→ 反序列化后为null- 静态变量不会恢复
- 只有被序列化的字段才会恢复
四、反序列化的 3 个必须条件
- 类必须实现
Serializable - 必须有相同的
serialVersionUID
不一样会直接报错:java.io.InvalidClassException - 类结构不能发生不兼容变化(例如删除字段、改类型)
五、最常见报错原因
- 没有 serialVersionUID
- 序列化前后 UID 变了
- 类结构修改(字段改名/删字段)
- 类路径不对 / 找不到类
- 数据被篡改
六、最简单记忆口诀
序列化:ObjectOutputStream.writeObject(对象)
反序列化:ObjectInputStream.readObject() 强转回对象
七、一句话总结
反序列化就是:读取字节流 → 还原成 Java 对象,必须保证类兼容、UID一致、实现Serializable。
更多推荐
所有评论(0)