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

时间:2014-06-08 23:58:34

标签: java serialization deserialization

我从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;

1 个答案:

答案 0 :(得分:3)

你问:

  

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

我能够找到的最佳理由(在Oracle文档中)位于WebLogic JMS Best Practice文档中:

  

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

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

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