2

重複の可能性:シリアル化可能な
内部クラスがシリアル化できないのはなぜですか?

を実装していないクラスがありますSerializableSerializableそのクラスの内部には、バージョン IDを実装して持つプログラム全体のデータを保持するデータ クラスがあります。

私の問題は、メイン クラスでデータ オブジェクトをシリアル化しようとすると、データ クラスではなくメイン クラスからオブジェクト書き込みエラーが発生することです。メイン クラスは を実装していませんSerializable

シリアル化できないクラス内でクラスをシリアル化できますか?

例:

class main
{
   class data implements Serializable
   {  // data and functions }

   public void main(args)
   { data d = new data();
     // ofcourse I have the proper inits and checks for the output stream and such
     writeObject(data);  // Throws Class not Serializable error.}
} 
4

2 に答える 2

6

そうdataではないので、シリアライズ可能ではないstatic外部クラスへの参照を暗黙的に持っています。main

クラスを作ってみてくださいstatic

于 2013-01-09T17:03:28.720 に答える
3

main.class を逆コンパイルすると、実際のコードでそれが表示されます

public class main {

    class data implements Serializable {
        final main this$0;

        data() {
            this$0 = main.this;
        }
    }
}

data外部クラスへの参照が含まれていますmain。このいわゆる合成フィールドは、javac によって追加されます。ObjectOutputStream がデータをシリアル化しようとすると、シリアル化できないクラスへの参照に出くわして中断します。したがって、シリアライズ可能にするにはmain、シリアライズ可能も実装するか、data静的クラスを作成する必要がありmainます。

于 2013-01-09T17:07:43.720 に答える