Java 序列化(Serialization)是指把 Java 对象转换成字节流,以便存储(文件、数据库)或网络传输;反序列化(Deserialization)则是把字节流恢复成 Java 对象。
下面从原理、机制、过程、关键点几个层面说明。
Java 序列化本质上是:
JVM 把对象的状态(成员变量)按照一定格式写成字节流,反序列化时再按格式读回来,重建对象
注意:
一个类要可序列化,只需:
import java.io.Serializable;
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
}
关键点:
Serializable 接口(空接口 / 标记接口)serialVersionUID 用于版本控制ObjectOutputStream)ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("user.dat")
);
oos.writeObject(user);
内部流程:
SerializableserialVersionUIDObjectInputStream ois = new ObjectInputStream(
new FileInputStream("user.dat")
);
User user = (User) ois.readObject();
流程:
serialVersionUID⚠️ 反序列化不会执行构造函数
private static final long serialVersionUID = 1L;
作用:
InvalidClassException
不写 UID 的风险:
| 情况 | 是否序列化 |
|---|---|
| 静态变量 | ❌ |
| transient 变量 | ❌ |
| 方法 | ❌ |
| 普通字段 | ✅ |
示例:
private transient String password; // 不序列化
private void writeObject(ObjectOutputStream oos) throws IOException {
oos.defaultWriteObject();
oos.writeUTF(encrypt(password));
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
ois.defaultReadObject();
password = decrypt(ois.readUTF());
}
❌ 体积大
❌ 速度慢
❌ 不安全(反序列化漏洞)
❌ 跨语言差
所以现在常用:
Java 序列化就是 JVM 按规则把对象字段写成字节流,反序列化时按规则还原对象,不调用构造方法,靠 Serializable 和 serialVersionUID 保证可用性和兼容性
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。