谁实际实现了可序列化方法?

我一直在学习如何使用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()writeObject() 。 如果需要进行自定义序列化,则只需要实现这些,例如,当对象中的字段不可序列化时。 如果只有可序列化的字段和基元,则不必实现自定义序列化方法。 此外,您可以通过向其添加transient关键字来跳过序列化的某些字段。

查看Serializable的API文档 ,它详细解释了该机制。

基本上,除非您想要更多地控制对象的序列化方式,否则您不必执行任何操作,在这种情况下,您可以实现一些“魔术”方法,这些方法将由序列化机制调用。

如果您想要完全控制,可以使用Externalizable 。

我知道如果我创建一个具有不同变量的类’A’来实现Serializable,我将Serializable添加到我的类中,它也是Serializable。

是的,这一刻你的课程是Serializable。

对于可序列化的类,包含为该类成员的每个对象也必须是可序列化的。 Java将运行您引用的所有对象的树,并依次序列化它们。

如果希望更好地控制对象的序列化方式,可以实现Externalizable接口:

Externalizable接口的writeExternal和readExternal方法由类实现,以使类完全控制对象及其超类型的流的格式和内容。

如果实现了一个必须可序列化的类,则还必须提供一个在同一个类中进行序列化的方法。

您不能依赖Object来猜测您的类需要成功序列化和反序列化。 考虑您的类的工作变量,例如,不需要序列化,Object将无法区分重要字段。