【问题标题】:Why is java.io.Serializable not a class?为什么 java.io.Serializable 不是一个类?
【发布时间】:2013-03-05 15:50:25
【问题描述】:

我知道这个问题听起来很奇怪,但我想知道为什么 java.io.Serializable 接口被精确地实现为一个接口,而不是一个类?

让我想到这一点的是,我们正在讨论覆盖 readObject/writeObject 方法,而根据定义,我们不会覆盖 em> 它们(即没有超类型的 Serializable 对象已经实现了这些方法)。

因此,如果Serializable 是一个类,它可以实现默认 readObject/writeObject 方法,然后扩展类就可以真的重写上述方法。


这是一个不起作用解决方法,可以说明我的话:

public class Serializable implements java.io.Serializable {

    private static final long serialVersionUID = 356223041512972356L;

    protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        stream.defaultReadObject();
    }

    protected void writeObject(ObjectOutputStream stream) throws IOException {
        stream.defaultWriteObject();
    }

}

public class MyClass extends Serializable {

    private static final long serialVersionUID = -5437634103734137046L;

    @Override
    protected void readObject(ObjectInputStream stream) throws IOException, ClassNotFoundException {
        super.readObject(stream);
        // custom readObject method
    }

}

PS:提供的解决方法不起作用,因为 readObject/writeObject 方法必须声明为 private 而我的是 protected

【问题讨论】:

标签: java class serialization interface overriding


【解决方案1】:

因为如果你想从 另一个 类继承并实现Serializable,那你真的搞砸了。这是 Java 在选择不支持真正的多重继承时所做的一般权衡。

您会注意到,Java 2.0 语言(Groovy 和 Scala)通过他们所谓的特征或 mixins 扭转了这一决定——它们的设计非常完全,因此您可以“混入”例如Serializable 功能,而不是从逻辑上派生出来 - 您可能会将其视为您提出了一个非常好的观点的证据,Java 会很好地听取您的意见。

【讨论】:

  • 咳咳,是的,当然,这很明显......我不知道为什么在发布问题之前我没有考虑过。非常感谢!
  • 因此,由于它是一个接口,您可以将 read/WriteObject 的方法签名添加到它,但这需要一个实际上不需要的实现。
【解决方案2】:

如果java.io.Serializable 是一个类,您将无法从另一个基类继承。

换一种说法,要么是继承,要么是序列化。

【讨论】:

    猜你喜欢
    • 2011-07-28
    • 2011-06-22
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多