Z
ZHANK
编程在线教程Java 教程序列化与反序列化
IO 编程

序列化与反序列化

理解 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);

// 优点:
// ✅ 跨语言
// ✅ 人类可读
// ✅ 不需要实现接口
// ✅ 无安全风险