为什么实现Externalizable需要一个默认的公共构造函数?

如果我们实现Serializable,我们不需要它。 为什么这个差异呢? 它与序列化的实际机制有什么关系?

可以在http://www.jusfortechies.com/java/core-java/externalization.php上找到详尽的解释(尽管可能会改进文章的语法)。 简短的回答,以供将来参考,以防链接页面消失:

Externalizable是一个扩展Serializable的接口。 但是,与Serializable相反,只是读取序列化的字节流不会恢复对象,但会调用公共构造函数,只有在创建了对象后,才会恢复其状态。 这使得恢复更有效。

编辑:另请参阅Java中的Serializable和Externalizable有什么区别? 。

这主要用于缓存目的。 为了反序列化流,你需要说明你希望如何反序列化对象,因此Externalizable接口中的合同提供了两种方法: writeExternalreadExternal 。 请注意, Externalizable扩展了Serializable ,因此您不一定需要实现Serializable接口(尽管它是一个标记接口,并且没有实际实现的方法)。

有关示例实现,请查看MimeType 。

使用Externalizable接口时需要公共的无参数构造函数。

因为在Serializable的情况下

  1. readObject从ObjectInputStream中读取所需的信息
  2. 序列化使用reflection机制来获取必要的字段及其相应的值。
  3. Serializable序列化所有数据成员(静态和瞬态除外)。

但在Externalizable的情况下

  1. 没有使用reflection机制。
  2. 用户不会序列化所有数据成员。这就是为什么要获取未外部化的成员的值,不需要arg构造函数。