【问题标题】:Why does implementing Externalizable need a default public constructor?为什么实现 Externalizable 需要一个默认的公共构造函数?
【发布时间】:2011-12-25 02:57:33
【问题描述】:

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

【问题讨论】:

    标签: java serialization


    【解决方案1】:

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

    Externalizable 是一个扩展 Serializable 的接口。然而,与 Serializable 不同,对象并不能通过读取序列化的字节流来恢复,而是调用公共构造函数,并且只有在创建对象后,才会恢复其状态。这使得恢复更有效率。

    编辑:另见What is the difference between Serializable and Externalizable in Java?

    【讨论】:

    • 鉴于这是一个接口,你在说什么公共构造函数?还是您指的是链接的文章?
    • 我指的是问题所在的同一个构造函数,即实现类的构造函数。
    • 啊,我看错了。谢谢!如果您提到在构造函数中直接调用实现方法,您的回答会更中肯。也就是说,你的答案比我的好。 :)
    • @S.R.I. - Externalizable 的构造函数不调用反序列化的“实现方法”。方法 (readExternal) 在构造函数返回后在新创建的对象上调用
    • 这个答案只是重复了一个事实,这让我们感到困扰。这怎么可能是答案?问题是为什么青蛙是绿色的,而所有其他爬行动物都是灰色的?你说青蛙是绿色的,爬行动物是灰色的。这怎么可能是答案?我想再次提出这个问题。
    【解决方案2】:

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

    有关示例实现,请查看MimeType

    【讨论】:

      【解决方案3】:

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

      因为在Serializable的情况下

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

      但如果是外部化

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

      【讨论】:

        猜你喜欢
        • 2021-04-24
        • 1970-01-01
        • 2012-12-25
        • 2013-07-01
        • 2019-03-01
        • 1970-01-01
        • 2017-01-10
        • 2011-05-08
        • 1970-01-01
        相关资源
        最近更新 更多