【发布时间】:2016-03-13 00:18:06
【问题描述】:
我正在阅读 J. Bloch 的有效 Java,现在我正在阅读关于序列化的部分。他说
如果一个为继承而设计的类是不可序列化的,它 可能无法编写可序列化的子类。具体来说,它 如果超类不提供可访问性将是不可能的 无参数构造函数。
我不明白这个限制。我在以下课程上试过这个:
private static class Base {
private int i;
private Object o;
public Base(int i, Object o){
if(i == 0 || o == null)
throw new IllegalArgumentException("The arguments are not accepted by this constructor");
this.i = i;
this.o = o;
}
private void readObjectNoData() throws InvalidObjectException{
throw new InvalidObjectException("Stream data required");
}
}
private static class Derived extends Base implements Serializable{
public Derived(int i, Object o) {
super(i, o);
}
private static final long serialVersionUID = 1L;
}
实际上,我可以序列化Derived 的一个实例,但是当我尝试对它进行期望时,我得到了异常:
java.io.InvalidClassException: com.pack.age.SerializableTest$Derived; no valid constructor
你不能解释一下这些事情的意义吗?我不明白为什么在这种情况下他们需要无参数的构造函数。
【问题讨论】:
-
因为代码试图在内存中重建一个类,部分要求是它有一个无参数的公共构造函数
标签: java serialization