【发布时间】: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。
【问题讨论】:
-
方法可以放入
Object,就像clone和Cloneable一样。但是看看为什么Cloneable是一个坏主意的所有原因,为什么Serializable不应该是一个类。 -
这与任何接口都不是类的原因相同。以免限制您可以继承的内容。
标签: java class serialization interface overriding