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

时间:2009-06-09 15:45:09

标签: java serializable

我一直在学习如何使用Serializable

我知道如果我创建了一个包含不同变量的类'A'来实现Serializable并且我将Serializable添加到我的班级,那么它也是Serializable

但是,实际上是谁实现了这两种方法来序列化? Object是否会处理所有事情,或者在必要时不同的类会重载它们?

6 个答案:

答案 0 :(得分:15)

序列化实际上是在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序列化还有许多其他扩展点。 serialization specification是了解所有这些内容的权威和完整来源。

答案 1 :(得分:7)

我认为您所讨论的方法是readObject()writeObject()。如果需要进行自定义序列化,则只需要实现这些,例如,当对象中的字段不可序列化时。如果只有可序列化的字段和基元,则不必实现自定义序列化方法。 此外,您可以通过向其添加transient关键字来跳过序列化的某些字段。

答案 2 :(得分:3)

查看Serializable的{​​{3}},它会详细解释机制。

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

如果您想要完全控制,可以改用API doc

答案 3 :(得分:1)

  

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

是的,这一刻你的班级是Serializable。

答案 4 :(得分:1)

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

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

  

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

答案 5 :(得分:-1)

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

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