为什么我们可以在java中重写writeObject和readObject时使用Externalizable

为什么我们可以在java中重写writeObject和readObject时使用Externalizable,java,serialization,externalizable,Java,Serialization,Externalizable,由于我们可以通过重写writeObject()和readObject()来重写默认的序列化过程,那么外部化接口的需求是什么?实现可序列化的类可能或可能不希望更改将该类的实例写入流的格式 但是,类实现Externalizable必须实现writeExternal和readExternal方法,类的职责是写入流中的数据,并恢复流中的数据。可序列化接口用于获取自动序列化功能,但如果您想提供自己的序列化逻辑(自定义逻辑),则可您会选择可外部化的接口。 Externalizable接口包含两种必须实现的方

由于我们可以通过重写writeObject()和readObject()来重写默认的序列化过程,那么外部化接口的需求是什么?

实现可序列化的类
可能可能不希望更改将该类的实例写入流的格式


但是,类实现
Externalizable
必须实现
writeExternal
readExternal
方法,类的职责是写入流中的数据,并恢复流中的数据。

可序列化接口用于获取自动序列化功能,但如果您想提供自己的序列化逻辑(自定义逻辑),则可您会选择可外部化的接口。 Externalizable接口包含两种必须实现的方法,即readExternal()writeExternal()


如果实现可序列化接口,则默认(自动)序列化过程会处理包括所有基类(超类)状态在内的所有内容。

这个问题有一些合理的答案

“序列化Java对象的CPU成本可能非常高。这一开销反过来会影响JMS对象消息。在某种程度上,您可以通过让应用程序对象实现java.io.Externalizable来抵消这一成本,但是在编组类描述符时仍然会有很大的开销。为了避免编写嵌入到对象消息中的其他对象的类描述符的成本,让这些对象实现Externalizable,并直接对它们调用readExternal和writeExternal。例如,调用obj.writeExternal(stream)而不是stream.writeObject(obj)。使用字节和流消息通常是首选做法。”


这是我(在Oracle文档中)在WebLogic JMS最佳实践文档中找到的最好的理由:

您可以通过重写readObject和writeObject方法来拥有自定义逻辑。您可以用这些方法添加一个可序列化的类的示例吗?