返回
序列化:在 JDK 1.1 及更高版本中持久化 Java 对象
见解分享
2023-11-10 16:33:13
序列化:对象持久化的基石
在软件开发中,对象是程序操作和管理数据的基本单位。然而,当程序需要跨越进程或机器边界时,这些对象的状态就需要以一种可传输和持久化的方式进行存储。这就是序列化发挥作用的地方。
序列化是一种机制,它将运行时对象的内存状态转换为二进制流。这个二进制流可以被存储在文件中、数据库中或通过网络传输。反过来,可以通过反序列化将二进制流还原为对象,从而恢复其原始状态。
JDK 1.1 中的序列化
序列化是在 Java 1.1 中引入的。它通过 java.io.Serializable
接口实现,该接口强制要求类显式声明其可被序列化的意图。实现 Serializable
的类及其所有非瞬态(non-transient)字段都将被序列化。
瞬态字段是不会被序列化的字段。它们通常包含对其他对象的引用或其他不希望持久化的数据。通过将字段声明为瞬态,可以控制序列化的粒度,防止不必要的状态被存储。
实现序列化
要使类可被序列化,需要遵循以下步骤:
- 实现
Serializable
接口。 - 声明要序列化的字段(非瞬态字段)。
- (可选)实现
writeObject
和readObject
方法,以便控制序列化和反序列化的过程。
public class Person implements Serializable {
private String name;
private int age;
// ... 省略 getter/setter 方法
}
反序列化
反序列化是序列化的逆过程,它将二进制流还原为对象。反序列化通过调用对象的 readObject
方法实现。反序列化需要类结构与序列化时的类结构完全匹配,否则会抛出异常。
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.bin"))) {
Person person = (Person) ois.readObject();
}
使用场景
序列化在 Java 开发中广泛用于以下场景:
- 持久化对象状态,以便在程序重新启动或系统崩溃后恢复数据。
- 通过网络传输对象,实现分布式系统中的数据交换。
- 在不同机器上共享对象,以便协同工作或数据共享。
替代方案
虽然 Serializable
是 Java 中最常用的序列化机制,但还有其他替代方案可供选择,例如:
Externalizable
接口:提供对序列化和反序列化过程的更细粒度控制。- JSON 序列化:将对象转换为 JSON 格式,更适合跨语言和平台的数据传输。
结论
序列化是 Java 中一项强大的功能,它允许开发人员持久化和传输对象状态。通过理解它的原理和使用方法,开发人员可以构建健壮且灵活的应用程序,这些应用程序能够跨进程和机器边界有效地交换数据。