我一直在学习如何使用Serializable
。
我知道如果我创建了一个包含不同变量的类'A'来实现Serializable
并且我将Serializable
添加到我的班级,那么它也是Serializable
。
但是,实际上是谁实现了这两种方法来序列化?
Object
是否会处理所有事情,或者在必要时不同的类会重载它们?
答案 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将无法区分那些重要的字段。