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

我从这篇文章中了解到,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; 

你问:

为什么我们需要引入新的Externalizable接口?

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

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

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

而“差异”是,如果您使用Serializable ,序列Serializable的工作通常是为您完成的,但使用Externalizable您需要自己编写代码。