由于我们可以通过覆盖 writeObject() 和 readObject() 来覆盖默认的序列化过程,那么 Externalizable 接口需要什么?
3 回答
类实现Serializable
可能希望也可能不希望更改该类的实例写入流的格式。
但是,类实现Externalizable
必须实现writeExternal
和readExternal
方法,并且类有责任将数据写入流/从流中恢复。
这个问题在这里有一些合理的答案
“序列化 Java 对象的 CPU 成本可能很高。这种成本反过来会影响 JMS 对象消息。在某种程度上,您可以通过让应用程序对象实现 java.io.Externalizable 来抵消这种成本,但仍然会有很大的影响编组类描述符的开销。为了避免编写嵌入在 Object 消息中的附加对象的类描述符的成本,让这些对象实现 Externalizable,并直接在它们上调用 readExternal 和 writeExternal。例如,调用 obj.writeExternal( stream) 而不是 stream.writeObject(obj)。使用 Bytes 和 Stream 消息通常是首选做法。
这是我能找到的最佳理由(在 Oracle 文档中)在 WebLogic JMS 最佳实践文档中:
可序列化接口是为了获得自动序列化功能而实现的,但如果您想提供自己的序列化逻辑(自定义逻辑),您会选择 Externalizable 接口。 Externalizable 接口包含两个必须实现的方法,即readExternal()和writeExternal()。
如果您实现 Serializable 接口,包括所有基类(超类)的状态在内的所有内容都由默认(自动)序列化过程处理。