我一直在学习如何使用Serializable
.
我知道如果我创建一个具有不同变量的类“A”Serializable
并添加Serializable
到我的类中,它也是Serializable
.
但是,实际上是谁在实现这两种序列化方法?是否Object
会在必要时处理所有事情或不同的类重载它们?
我一直在学习如何使用Serializable
.
我知道如果我创建一个具有不同变量的类“A”Serializable
并添加Serializable
到我的类中,它也是Serializable
.
但是,实际上是谁在实现这两种序列化方法?是否Object
会在必要时处理所有事情或不同的类重载它们?
序列化实际上是在java.io.ObjectOutputStream
(和 java.io.ObjectInputStream)及其一些辅助类中实现的。在很多情况下,这种内置支持就足够了,开发者只需要实现标记接口即可Serializable
。这个接口被称为“标记”,因为它没有声明任何方法,因此在实现类上不需要任何特殊的 API。
如果需要,程序员可以用他们自己的方法添加或替换默认的序列化机制。例如,如果在反序列化对象后需要进行一些额外的初始化,则可以添加具有以下签名的方法:
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, java.lang.ClassNotFoundException
要完全控制序列化和反序列化,请实现java.io.Externalizable
而不是Serializable
.
如果需要,Java 序列化中还有许多其他扩展点。序列化规范是学习所有这些的权威和完整的来源。
我想你所说的方法是readObject()
and writeObject()
。如果您需要进行自定义序列化,例如当您的对象中有不可序列化的字段时,您只需要实现这些。如果您只有可序列化的字段和原语,则不必实现自定义序列化方法。transient
此外,您可以通过向它们添加关键字来跳过一些序列化字段。
查看API doc,Serializable
它详细解释了机制。
基本上,除非您想更好地控制对象的序列化方式,否则您不必做任何事情,在这种情况下,您可以实现一些“魔术”方法,这些方法将由序列化机制调用。
如果你想要完全控制,你可以使用Externalizable代替。
我知道如果我创建一个具有实现 Serializable 的不同变量的类“A”并将 Serializable 添加到我的类中,它也是可序列化的。
是的,此时您的课程是可序列化的。
对于可序列化的类,作为该类成员包含的每个对象也必须是可序列化的。Java 将沿着你引用的所有对象的树向下运行,并依次序列化它们。
如果您想更好地控制对象的序列化方式,可以实现 Externalizable 接口:
Externalizable 接口的 writeExternal 和 readExternal 方法由一个类实现,以使该类可以完全控制对象及其超类型的流的格式和内容。
如果你实现了一个必须可序列化的类,你还必须提供一个在同一个类中进行序列化的方法。
您不能依赖 Object 来猜测您的类需要成功序列化和反序列化。例如,想想你的类的工作变量不需要序列化,Object 将无法将它们与重要字段区分开来。