内部类的外部化

时间:2014-01-08 06:07:45

标签: java externalizable

我正在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)。那么是哪一个呢。任何建议都表示赞赏。

2 个答案:

答案 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)