Java中的Serializable-writeObject()/ ReadObject和Externalizable-readExternal()/ writeExternal()有什么区别?

jam*_*007 5 java serialization deserialization

我从这篇文章中了解到Serializable非常容易实现,并且可以灵活地进行更改(在大多数情况下,您要做的就是更新serialversionUID)。如果我们想控制读写过程,我们可以实现Externalizable。

如果只需要控制读写过程,就可以覆盖以下方法进行序列化,对吗?为什么我们需要引入新的接口Externalizable?

private void writeObject(java.io.ObjectOutputStream out)
     throws IOException
 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;
 private void readObjectNoData()
     throws ObjectStreamException;
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 5

你问:

为什么我们需要引入新的界面Externalizable

我能够找到的最佳理由(在 Oracle 文档中)位于WebLogic JMS 最佳实践文档(原始链接)中:

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

简而言之,Externalizable至少在某些情况下,您可以使用 获得更好的性能。

“区别”在于,如果您使用Serializable序列化工作,通常会为您完成,但如果您使用序列化工作,则Externalizable需要您自己编写代码。