0Pricing
Java Academy · 课时

Java 序列化基础

实现 Serializable,使用 ObjectOutputStream 将对象写入流,并将其读回

Java 序列化基础 是 CoddyKit 上的免费 Java Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

什么是 Java 序列化

序列化会将对象的状态转换为字节流,以便保存到磁盘、通过网络发送或存储在数据库中。反序列化则反向执行这一过程。

可序列化标记接口

要序列化一个类,请实现 java.io.Serializable。它没有方法——它向 JVM 发出信号,表示该类的实例可以被序列化。

import java.io.Serializable;
public class User implements Serializable {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override public String toString() { return name + " / " + age; }
}

使用 ObjectOutputStream 写入对象

将 FileOutputStream 包装在 ObjectOutputStream 中,然后调用 writeObject() 进行序列化。

import java.io.*;
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("user.ser"))) {
    oos.writeObject(new User("Alice", 30));
    System.out.println("Serialized successfully");
}

使用 ObjectInputStream 读取对象

将 FileInputStream 包装在 ObjectInputStream 中,然后调用 readObject() 进行反序列化。将结果转换为预期类型。

import java.io.*;
try (ObjectInputStream ois = new ObjectInputStream(
        new FileInputStream("user.ser"))) {
    User u = (User) ois.readObject();
    System.out.println("Deserialized: " + u);
}

序列化对象图

序列化对象所引用的所有对象也必须实现 Serializable,否则运行时会抛出 NotSerializableException。

public class Order implements Serializable {
    private User customer;   // User must be Serializable
    private List<String> items;
    public Order(User customer, List<String> items) {
        this.customer = customer;
        this.items = items;
    }
}

NotSerializableException

如果对象图中的任何字段不可序列化且未标记为 transient,Java 会在写入时抛出 NotSerializableException。

// Thread is NOT Serializable
public class Task implements Serializable {
    private Thread worker; // throws NotSerializableException!
    // Fix: mark as transient
    private transient Thread worker2;
}

对象图与共享引用

Java 会在序列化期间跟踪对象身份。如果两个字段引用同一个对象,则只会写入一个副本,反序列化后两个字段也会指向同一个实例。

序列化集合

ArrayList、HashMap 和 LinkedList 等标准集合已经实现了 Serializable,因此只要它们的元素也可序列化,集合就可以被序列化。

List<String> names = new ArrayList<>(List.of("Alice", "Bob"));
try (ObjectOutputStream oos = new ObjectOutputStream(
        new FileOutputStream("names.ser"))) {
    oos.writeObject(names);
}

继承与序列化

如果父类是 Serializable,所有子类也都可序列化。如果父类是 NOT 可序列化的,父类字段不会被保存;父类必须有一个无参构造函数才能进行反序列化。

验证字节流

序列化字节流以魔数字节 0xACED 0x0005 开头。您可以使用十六进制编辑器检查它,也可以使用 SerialVer 工具解码它,以了解其格式。

安全警告

Java 反序列化是已知的攻击向量。未经验证,切勿反序列化来自不可信来源的数据。对于外部数据,优先使用 JSON、协议缓冲区或带签名的信封。

快速检查

哪个方法可以将对象序列化到流中?

回顾

Java 序列化使用 ObjectOutputStream / ObjectInputStream。类必须实现 Serializable。避免序列化不可信数据——新代码应优先采用现代替代方案。

常见问题解答

「Java 序列化基础」课时是免费的吗?

是的 — 「Java 序列化基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「Java 序列化基础」这节课中我会学到什么?

实现 Serializable,使用 ObjectOutputStream 将对象写入流,并将其读回 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「Java 序列化基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Java 序列化基础
  2. transient 字段与 serialVersionUID
  3. 自定义序列化:writeObject 与 readObject
  4. 现代替代方案:JSON 与 Protocol Buffers
← 返回 Java Academy