序列化与反序列化
理解 Serializable 接口、transient、JSON 序列化替代
序列化与反序列化
序列化将对象转为字节流,用于存储、网络传输和深拷贝。
学完本章你将: 理解 Serializable、transient、JSON 替代。
Serializable 接口
java
// 标记接口 —— 表示可序列化
class User implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private transient String password; // 不序列化
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
读写对象
java
// 写对象到文件
User user = new User("Alice", 25);
try (ObjectOutputStream oos = new ObjectOutputStream(
new FileOutputStream("user.dat"))) {
oos.writeObject(user);
}
// 从文件读对象
try (ObjectInputStream ois = new ObjectInputStream(
new FileInputStream("user.dat"))) {
User restored = (User) ois.readObject();
System.out.println(restored.getName()); // "Alice"
// password 是 null(transient)
}
serialVersionUID
java
// 版本控制:修改类后仍能反序列化旧数据
private static final long serialVersionUID = 1L;
// 反序列化时不调用构造方法
// 而是从流中直接重建对象
JSON 替代方案(推荐)
java
// 现代项目用 JSON 代替 Java 原生序列化
// Jackson
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(user);
User restored = mapper.readValue(json, User.class);
// 优点:
// ✅ 跨语言
// ✅ 人类可读
// ✅ 不需要实现接口
// ✅ 无安全风险