16

我一直在学习如何使用Serializable.

我知道如果我创建一个具有不同变量的类“A”Serializable并添加Serializable到我的类中,它也是Serializable.

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

4

6 回答 6

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 序列化中还有许多其他扩展点。序列化规范是学习所有这些的权威和完整的来源。

于 2009-06-09T15:57:46.150 回答
7

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

于 2009-06-09T15:54:45.367 回答
3

查看API docSerializable它详细解释了机制。

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

如果你想要完全控制,你可以使用Externalizable代替。

于 2009-06-09T16:06:48.757 回答
1

我知道如果我创建一个具有实现 Serializable 的不同变量的类“A”并将 Serializable 添加到我的类中,它也是可序列化的。

是的,此时您的课程是可序列化的。

于 2009-06-09T15:58:16.803 回答
1

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

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

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

于 2009-06-09T16:07:57.743 回答
-1

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

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

于 2009-06-09T15:52:46.507 回答