Java 中的反序列化

2024 年 9 月 10 日 | 阅读 3 分钟

反序列化,通常称为解组,是将序列化数据恢复到其原始形式,以便应用程序可以利用它。通过 Serializable 和 Externalizable 接口,Java 支持序列化和反序列化,这些接口用于将对象转换为字节流并反之。

自定义序列化

通过实现 Serializable 接口并提供独特的 readObject() 和 writeObject() 方法,Java 使您能够自定义序列化过程。这对于处理瞬态字段、循环引用和加密等独特情况非常有用。

Externalizable 接口

Java 还提供了 Externalizable 接口,该接口为用户提供了对序列化和反序列化过程的更多控制,以及 Serializable 接口。可外部化对象需要实现两个方法,这两个方法定义了对象的状态如何写入和读取到流中:writeExternal() 和 readExternal()。

ObjectInputStream

ObjectInputStream 类提供了一种在反序列化期间检查序列化数据的方法。ObjectInputStream 验证。通过在序列化对象的类中实现 validateObject() 函数,您可以提供独特的测试来确保数据在反序列化之前是正确的。

版本和序列化格式

在序列化和反序列化对象时,考虑对象类的不同版本之间的兼容性至关重要。对象的序列化形式包含有关其类的信息,包括名称、serialVersionUID、字段名称和内容。通过仔细控制类的版本控制和利用版本控制工具,您可以确保序列化对象在程序的多个版本之间始终兼容。

序列化和反序列化

对象被转换为字节流,称为序列化,然后可以将其保存在文件中、通过网络发送或存储在数据库中。开发人员可以使用 Java 的 Serializable 和 Externalizable 接口为其类实现序列化。

反序列化为何重要?

反序列化是 Java 序列化的关键组成部分。它能够将对象在不同的应用程序、平台或语言之间传输,而不会丢失其状态。例如,如果两个应用程序都可以访问序列化对象的类定义,那么一个应用程序中的对象可以被序列化并在另一个应用程序中反序列化。

反序列化在将对象保留在数据库或缓存系统中时也很有用。对象可以被序列化并以字节数组的形式保存,而不是以其未处理的状态存储。当需要时,通过从字节数组反序列化对象,可以节省时间和资源。

反序列化实现

Java 通过 ObjectInputStream 类内置支持反序列化,该类将对象从字节流反序列化。

创建 ObjectInputStream 对象并使用其 readObject() 函数从输入流中读取对象以反序列化对象。以下是一个示例

文件名:Employee.java

Unmarshalling.java

Employee.ser

输出

Deserialized Employee object:
Name: John Doe
ID: 12345
Salary: 50000.0

解释

此结果验证了 Employee 对象已成功反序列化,并且其字段的序列化值已正确应用。如果文件“employee.ser”不存在或为空,程序将打印 IOException 堆栈跟踪。如果文件中的序列化对象是未知类或在序列化过程中被修改,程序将生成 ClassNotFoundException 堆栈跟踪。

结论

反序列化是 Java 序列化的重要组成部分,它能够将对象在应用程序、平台或语言之间传输,而不会丢失其状态。Java 通过 ObjectInputStream 类内置支持反序列化,该类将对象从字节流反序列化。在本文中,我们研究了 Java 中的反序列化实现,并详细说明了该过程。