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

8
我从this的帖子中了解到,可序列化(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;

什么帖子?没有链接。 - user207421
1个回答

5
您问:
为什么我们需要引入新的接口Externalizable
我能找到的最好的理由(在Oracle文档中)在WebLogic JMS Best Practice文档(原始链接)中:
“序列化Java对象的CPU成本可能很高。这种费用反过来又影响了JMS对象消息。您可以通过让应用程序对象实现java.io.Externalizable来在一定程度上抵消这些成本,但是在编组类描述符方面仍然存在重大开销。为了避免不得不编写嵌入在Object消息中的其他对象的类描述符的成本,请让这些对象实现Externalizable,并直接调用它们的readExternal和writeExternal。例如,调用obj.writeExternal(stream)而不是stream.writeObject(obj)。使用Bytes和Stream消息通常是首选做法。”
简言之,在某些情况下使用Externalizable可以获得更好的性能。
而“不同之处”在于,如果使用Serializable,通常会为您完成序列化工作,但是使用Externalizable需要自己编写代码。

这里提供一个可访问的链接点击此处(因编辑队列已满而进行了注释)。 - Leponzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接