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 反馈 — 无需本地设置。
此课程中的所有课时
- Java 序列化基础
- transient 字段与 serialVersionUID
- 自定义序列化:writeObject 与 readObject
- 现代替代方案:JSON 与 Protocol Buffers