我正在this网站上阅读有关外部化的文章,我在外化部分的限制中找到了以下内容。
如您所知,将在调用时调用默认的public no-arg构造函数 序列化实现Externalizable接口的对象。 因此,Innerizable接口不能由Inner Classes实现 在Java中,Java中内部类的所有构造函数都将始终存在 接受封闭类的实例作为前置参数 因此你不能为内部类创建一个no-arg构造函数。 内部类只能通过实现来实现对象序列化 可序列化的界面。
我对此进行了测试,结果证明这是无效的。内部类可以没有参数构造函数,也可以实现Externalizable
接口。甚至尝试过本地课程。工作正常。
public class ExternalizeDemo {
class InnerClass implements Externalizable{
public InnerClass() {
//default no-arg inner class constructor
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
//logic to save object state
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//logic to retrieve object state
}
}
public void localClassTest(){
class LocalClass implements Externalizable{
public LocalClass(){
//default no-arg local class constructor
}
@Override
public void writeExternal(ObjectOutput out) throws IOException {
//logic to save object state
}
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
//logic to retrieve object state
}
}
}
}
所以要么我缺少某些观点,要么文章段落不再有效(我使用的是Java 7)。那么是哪一个呢。任何建议都表示赞赏。
答案 0 :(得分:2)
段落意味着你不能在没有外部类的实例的情况下创建内部类的实例(非静态嵌套类)。
因此,在反序列化以创建内部类的实例时,代码将需要以某种方式使用外部类的实例。
你必须致电
ExternalizeDemo mainClassInstance=some initializing;
mainClassInstance.new InnerClass();
反序列化不会有mainClassInstance来创建InnerClass实例。
答案 1 :(得分:0)
它在运行时失败...下面的Wizard类是SerialiserTest的内部类,并实现了Externalizable
Wizard w = new SerialiserTest().new Wizard();
outputStream = new ByteArrayOutputStream();
objectOutputStream = new ObjectOutputStream(outputStream);
objectOutputStream.writeObject(w);
byteArrayInputStream = new ByteArrayInputStream(outputStream.toByteArray());
inputStream = new ObjectInputStream(byteArrayInputStream);
Wizard wiz = (Wizard) inputStream.readObject();
Exception in thread "main" java.io.InvalidClassException: jtk.file.ser.SerialiserTest$Wizard; no valid constructor
at java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:150)