Externalization in Java

2025年3月29日 | 阅读 4 分钟

Java 中的 Externalization 用于自定义序列化机制。Java 序列化效率不高。当我们有包含大量属性和特性的臃肿对象时,将它们序列化是不好的。这时,Externalization 会更有效。

让我们在 Java 中了解一下序列化

Java 中的序列化是什么

序列化是将对象的状态写入字节流的机制。序列化主要用于 Hibernate、RMI、JPA、EJB 和 JMS 等技术。与序列化过程相反的机制称为反序列化。这些过程是平台无关的,意味着我们可以在一个平台上序列化对象,并在其他平台上反序列化它们。

实现 Serializable 接口用于在 Java 中序列化对象。

阅读更多关于 Java 中的序列化和反序列化

现在回到我们的主要话题,Java 中的 Externalization。

Java 中的 Externalization 是什么

当我们在具有多个属性和特性的臃肿对象时,Java 序列化效率不高。这时,Externalization 就派上用场了。它允许我们自定义序列化。例如,如果我们为一个类实现了 Serialization 接口,我们可以使用 writeExternal() 方法进行 Externalization。当用户从他们的端重构一个 Externalization 对象时,对象的一个实例将使用 readExternal() 方法创建。

因此,Externalization 提供了自定义序列化,我们可以管理我们的对象流并决定在其中存储什么。

如果我们想序列化对象的一部分,Externalization 会很有用。我们可以只序列化对象中需要的字段。

Externalizable 接口

我们需要实现 java.io.Externalizable 接口来在序列化和反序列化过程中控制读写。readExternal()writeExternal() 方法是 Externalizable 接口的一部分。

让我们来了解一下这些方法

Externalizable 接口中的 readExternal() 方法

Externalizable 接口的对象使用 readExternal() 方法实现。它通过调用 DataInput 的方法来恢复原始数据类型的对象。对于对象、字符串和数组数据类型,它可以调用 readObject。

让我们了解如何实现 readExternal() 方法。

当我们向 readExternal() 方法传递一个对象时,它会接收对象输入。

对于原始数据类型,我们可以使用 readBoolean()、readByte()、readInt()、readLong() 方法。

对于 String、Arrays 或任何自定义类,我们可以使用 readObject() 方法。

它的用法如下

从上面的代码片段可以看出,readInt() 和 readObject() 方法用于反序列化 code、name、password 和 birthday 的值。

Externalizable 接口中的 writeExternal() 方法

Externalizable 接口的 writeExternal() 方法用于通过调用 dataOutput 的方法来保存原始值。对于对象、字符串和数组,调用 ObjectOutput 的 writeObject 方法。

让我们了解 writeExternal() 方法的实现

将对象的状态写入底层流应遵循以下规则

对于原始类型的值,使用 writeBoolean()、writeByte()、writeInt()、writeLong() 方法。

对于字符串、数组和自定义类,使用 writeObject() 方法。

考虑以下代码片段

从上面的代码片段可以看出,writeInt() 和 writeObject() 方法用于序列化 code、name、password 和 birthday 的值。

因此,我们可以看到如何使用 Java 中的 Externalization 来自定义序列化。

Java 中 Externalization 的示例

我们可以使用 Externalization 将 Java 类保存到字节流中。它提供了对类持久化为字节流的完全控制。我们必须在需要 Externalization 的类中实现 Externalizable 接口并定义其方法,即 writeExternal() 和 readExternal()。

让我们看一个 Java 中 Externalization 的示例。

User.java

JTPMain.java

输出

After De externalization username: JavaTpoint and age is:25

在上面的示例中,writeExternal() 方法保存的字段将作为字节流持久化,而其他字段将不会被 Externalization。因此,使用 Externalizable 接口,我们可以完全控制 Java 类的持久化。

让我们讨论一下序列化和 Externalization 之间的区别,以阐明两者的概念

序列化与 Externalization 的区别

序列化Externalization
Interface它是一个标记接口而它包含两个方法 readExternal() 和 writeExternal()
过程默认序列化自定义序列化
UIDserialVersionUID无 UID
存储存储包含对象的数据直接存储对象
访问无访问权限完全控制自定义序列化
性能性能相对较慢。提供对实现方法的完全控制。