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

时间:2011-12-25 02:57:34

标签: java serialization

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

3 个答案:

答案 0 :(得分:6)

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

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

修改:另请参阅What is the difference between Serializable and Externalizable in Java?

答案 1 :(得分:1)

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

有关示例实现,请查看MimeType

答案 2 :(得分:0)

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

因为在Serializable的情况下

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

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