为什么java.io.Serializable不是一个类?

sp0*_*00m 3 java serialization overriding interface class

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

是什么让我想到这一点,是我们正在谈论覆盖readObject/ writeObject方法,而根据定义,我们并不覆盖他们(即没有超类型我们对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
    }

}
Run Code Online (Sandbox Code Playgroud)

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

dje*_*lin 12

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

你会注意到Java 2.0语言(Groovy和Scala)通过他们称之为traits或mixins的方式改变了这个决定 - 它们几乎都是精确设计的,所以你可以"混合",例如Serializable功能,而不是从逻辑上只是从它得到 - 你可能会把你作为一个非常好的观点作为证据,而Java本来可以很好地听取你的意见.