【问题标题】:What is the difference between Serializable - writeObject()/ReadObject and Externalizable - readExternal()/writeExternal() in Java? [duplicate]Java 中的 Serializable - writeObject()/ReadObject 和 Externalizable - readExternal()/writeExternal() 有什么区别? [复制]
【发布时间】:2014-06-08 23:58:33
【问题描述】:

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

【问题讨论】:

标签: java serialization deserialization


【解决方案1】:

你问:

为什么要引入新接口Externalizable

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

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

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

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

【讨论】:

  • 可访问链接here(由于编辑队列已满而发表评论)
猜你喜欢
  • 2011-10-28
  • 2023-03-15
  • 2019-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
相关资源
最近更新 更多