为什么当我们可以覆盖写对象和读取Java中的对象时,我们有外部化

2022-09-02 22:31:21

由于我们可以通过覆盖 writeObject() 和 readObject() 来覆盖默认的序列化过程,那么外部化接口的需求是什么?


答案 1

类实现可能希望也可能不希望更改将该类的实例写入流的格式。Serializable

但是,类实现必须实现 和 方法,并且类负责将数据写入流/从流还原数据。ExternalizablewriteExternalreadExternal


答案 2

这个问题在这里有一些合理的答案

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

这是我能够找到的最好的理由(在Oracle文档中)是在WebLogic JMS最佳实践文档中: