-1

このサイトの外部化に関する記事を読んでいて、外部化セクションの制限で次の段落を見つけました。

ご存じのように、Externalizable インターフェイスを実装するオブジェクトをシリアル化するときに、デフォルトの public no-arg コンストラクターが呼び出されます。したがって、Java の内部クラスのすべてのコンストラクターは、外側のクラスのインスタンスを先頭に追加されたパラメーターとして常に受け入れるため、Java の内部クラスによって Externalizable インターフェイスを実装することはできません。したがって、引数のないコンストラクターを使用することはできません内部クラス。内部クラスは、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();

デシリアライズには、InnerClass インスタンスを作成するための mainClassInstance がありません。

于 2014-01-08T07:05:07.743 に答える