Java 谁真正实现了可序列化方法?

Java 谁真正实现了可序列化方法?,java,serializable,Java,Serializable,我一直在学习如何使用Serializable 我知道如果我创建了一个具有不同变量的类“a”,这些变量实现了Serializable,并且我将Serializable添加到我的类中,那么它也是Serializable 但是,究竟是谁在实现这两种序列化方法呢? Object会处理所有事情吗?或者不同的类会在必要时重载它们吗?如果实现一个必须可序列化的类,那么还必须提供一个在同一个类中进行序列化的方法 您不能依靠对象来猜测成功序列化和反序列化类所需的内容。例如,假设类的工作变量不需要序列化,Objec

我一直在学习如何使用
Serializable

我知道如果我创建了一个具有不同变量的类“a”,这些变量实现了
Serializable
,并且我将
Serializable
添加到我的类中,那么它也是
Serializable

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

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


您不能依靠对象来猜测成功序列化和反序列化类所需的内容。例如,假设类的工作变量不需要序列化,Object将无法将这些变量与重要字段区分开来。

我想您讨论的方法是
readObject()
writeObject()
。只有在需要进行自定义序列化时,才需要实现这些功能,例如,当对象中有不可序列化的字段时。如果只有可序列化的字段和原语,则不必实现自定义序列化方法。
此外,您还可以通过向一些字段添加
transient
关键字来跳过这些字段。

序列化实际上是在
java.io.ObjectOutputStream
(和java.io.ObjectInputStream)及其一些助手类中实现的。在许多情况下,这种内置支持就足够了,开发人员只需实现marker接口
Serializable
。此接口称为“标记”,因为它不声明任何方法,因此不需要实现类上的任何特殊API

如果需要,程序员可以使用自己的方法添加或替换默认的序列化机制。例如,如果反序列化对象后需要进行一些额外的初始化,则可以使用以下签名添加方法:

private void readObject(java.io.ObjectInputStream s)
               throws java.io.IOException, java.lang.ClassNotFoundException
要完全控制序列化和反序列化,请实现
java.io.Externalizable
而不是
Serializable

如果需要,Java序列化中还有许多其他扩展点。这是一个权威和完整的来源,了解所有这些

我知道如果我创建了一个具有不同变量的类“a”,这些变量实现了Serializable,并且我将Serializable添加到我的类中,那么它也是可以序列化的

是的,现在您的类是可序列化的。

请看可序列化的
部分,它详细解释了机制

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


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

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

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

writeExternal和readExternal 可外化的方法 接口由一个类实现 给类完全的控制权 有关文件的格式和内容 对象及其子对象的流 超类型


这就是transient关键字的作用:在序列化对象时跳过这些字段。默认序列化通常是正确的。如果存在“不重要”字段,为什么还要在对象中包含它们?你说的“必须”是什么意思?嗯。。。不。实现可序列化,如果所有字段都可序列化,那么类也是可序列化的。谈论Java,对吗?完全不正确;你不用自己实现任何东西就可以很好地序列化。引用中包括“实现可序列化的不同变量”,谢谢。我想我被误解了。我真正想问的是:如果我的类实现了serializable,那么谁来负责实现序列化方法呢。“…序列化实际上是在java.io.ObjectOutputStream(和java.io.ObjectInputStream)及其一些助手类中实现的…”看起来是正确的答案。谢谢埃里克森!