繁体   English   中英

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

[英]Why is java.io.Serializable not a 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
    }

}

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

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

你会注意到Java 2.0语言(Groovy和Scala)通过他们所谓的traits或mixins来改变这个决定 - 它们的设计非常精确 ,所以你可以“混入”例如Serializable功能,而不是逻辑上只是从它派生 - 这你可以把你作为一个非常好的观点作为证据,而Java本来可以很好地听取你的意见。

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

换句话说,它是继承或序列化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM