序列化是将Java对象转换为字节流以便存储或传输,反序列化是将其恢复为对象的过程。实现Serializable接口即可支持序列化,使用ObjectOutputStream的writeObject()方法序列化对象到文件,通过ObjectInputStream的readObject()方法读取并还原对象,需注意serialVersionUID一致性、静态变量不被序列化、transient字段跳过及父类序列化要求等关键细节。

序列化与反序列化是Java中处理对象持久化的重要机制。简单来说,序列化是将一个Java对象转换为字节流的过程,而反序列化则是将字节流恢复为原来的对象。这种机制常用于对象的网络传输、保存到文件或数据库等场景。
什么是序列化
当你需要把一个对象保存到磁盘或者通过网络发送时,Java不能直接处理整个对象。它必须把对象“打散”成一串可存储或可传输的字节。这个过程就是序列化。
要让一个类支持序列化,只需实现 java.io.Serializable 接口。这个接口是一个标记接口,不需要实现任何方法。
例如:
立即学习“Java免费学习笔记(深入)”;
public class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
实现了 Serializable 后,就可以使用 ObjectOutputStream 将对象写入文件或输出流。
如何进行序列化操作
使用 ObjectOutputStream 可以完成序列化。以下是一个将对象保存到文件的例子:
- 创建一个 FileOutputStream 指向目标文件
- 包装成 ObjectOutputStream
- 调用 writeObject() 方法写入对象
代码示例:
Person person = new Person("Alice", 25);
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
oos.writeObject(person);
System.out.println("对象已序列化");
} catch (IOException e) {
e.printStackTrace();
}
反序列化的实现方式
反序列化是序列化的逆过程。使用 ObjectInputStream 从字节流中重建对象。
- 用 FileInputStream 读取保存的文件
- 包装成 ObjectInputStream
- 调用 readObject() 方法读取对象
- 注意返回的是 Object 类型,需强制转换
示例代码:
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
Person person = (Person) ois.readObject();
System.out.println("反序列化对象:" + person);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
需要注意的关键点
虽然序列化使用简单,但有几个细节容易忽略:
- serialVersionUID:建议显式定义。如果类结构发生变化(如增删字段),没有这个ID可能导致反序列化失败
- 静态变量不会被序列化,因为它们属于类,不属于实例
- 用 transient 关键字修饰的字段不会被序列化,适用于敏感信息(如密码)
- 父类实现 Serializable,子类自动支持;若父类未实现,则子类需有无参构造函数用于反序列化
基本上就这些。掌握序列化和反序列化,就能在需要保存或传输对象时灵活应对。不复杂但容易忽略细节。










