Java 中序列化与反序列化的区别

2025年3月17日 | 阅读 3 分钟

序列化反序列化是用于将 Java 对象转换为可快速传输、存储或重新创建的格式的基本概念。

Difference Between Serialization and Deserialization in Java

序列化

序列化是将对象转换为字节流的过程,以便可以快速地将其通过网络发送、保存在文件中或保存在数据库中。保留对象的状态是序列化的主要目标。

目的

序列化的主要用途包括:在数据库中存储对象、通过网络传输对象以及将对象状态保存到文件中。

用例

  1. 基于文件的对象状态存储。
  2. 通过网络发送数据。
  3. 在数据库中保留对象。

提供的 Java 代码中,一个 Person 类的对象被序列化并保存到文件(person.ser)中,以演示序列化过程。

Person.java

输出

Serialization completed. Object is saved in person.ser

Person.ser

反序列化

从字节流中重建对象称为反序列化。它包括读取字节流并生成一个在状态上与原始对象相同的对象。

用例

  1. 从文件中提取对象。
  2. 通过网络获取对象。
  3. 从数据库中获取对象。

DeserializePerson.java


方面序列化反序列化
目的将对象转换为字节流以进行存储或传输。从字节流中重建对象。
输出格式字节流(通常在文件中或通过网络)。具有与原始对象相同状态的对象。
过程将对象状态写入字节流。读取字节流并创建对象。
涉及的类ObjectOutputStream,Serializable 接口。ObjectInputStream,Serializable 接口。
异常处理IOException(用于文件操作)。IOException,ClassNotFoundException。
用例存储对象,通过网络传输对象。从文件读取对象,通过网络接收对象。
流向从对象到字节流从字节流到对象
对象创建原始对象未更改;生成了字节流。根据字节流,创建了一个新对象。
文件大小/网络延迟这可能会导致更大的文件或更多的网络开销。大小会影响对象的重构时间和资源需求。
安全限制在反序列化来自不可信来源的数据时必须小心。验证并清理输入以防止漏洞。
被动域不包含在序列化中。在反序列化期间初始化为默认值。
兼容性对类层次结构的修改可能会影响早期版本的反序列化方式。为了向前和向后兼容性,需要加以注意。
格式说明将对象转换为平台无关的字节流。在读取字节流后重建对象。
性能资源密集型,尤其是在处理大型或复杂对象时。资源密集型,对象大小会影响性能。
对象图的序列化能够序列化整个对象图。循环引用和复杂对象图需要谨慎处理。
序列化顺序对象按写入顺序进行序列化。反序列化对象的顺序必须与其序列化顺序匹配。
Externalizable 接口支持使用 Serializable 接口进行自动序列化。通过 Externalizable 接口支持自定义序列化。
流式 API 集成与 Java I/O 的流式 API 集成。使用 Java I/O 流式 API 从字节流读取。

结论

在 Java 编程中,序列化和反序列化是基本概念,对于分布式系统、网络通信和数据持久化等任务至关重要。在本深入分析中,我们全面探讨了序列化和反序列化之间的区别,掌握了它们的细微差别、应用和实现细节。