-1

我正在浏览这个网站上关于外化的文章,我在外化部分的限制中找到了以下段落。

如您所知,在序列化实现 Externalizable 接口的对象时,将调用默认的公共无参数构造函数。因此,Java 中的内部类无法实现 Externalizable 接口,因为 Java 中的内部类的所有构造函数都将始终接受封闭类的实例作为前置参数,因此您不能使用无参数构造函数一个内部类。内部类只需实现 Serializable 接口即可实现对象序列化。

我对此进行了测试,结果证明这是无效的。内部类可以没有参数构造函数,也可以实现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)。那么是哪一个呢。任何建议表示赞赏。

4

2 回答 2

2

该段落意味着您不能在没有外部类实例的情况下创建内部类实例(非静态嵌套类)。

因此,在反序列化以创建内部类的实例时,代码将需要以某种方式使用外部类的实例。

你必须打电话

ExternalizeDemo mainClassInstance=some initializing;

mainClassInstance.new InnerClass();

反序列化不会有 mainClassInstance 来创建 InnerClass 实例。

于 2014-01-08T07:05:07.743 回答
0

它在运行时失败......下面的向导类是 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)
于 2016-11-20T14:09:32.043 回答