2012-02-12 12 views
2

私はクラスをシリアライズしています。私は次の構造を持っている:「有効なコンストラクタがありません」例外が発生するのはなぜですか?

class A { class B { public B(); ... } } 
class C extends A { class D extends A.B implements Serializable { public D(); } } 

を私はタイプC.Dのオブジェクトを書くことができますが、私は戻ってそれらを読み取ろうとするたびに、私は例外を取得:

java.io.InvalidClassException: C$D; C$D; no valid constructor 

任意のアイデア?

ここでは、http://docs.oracle.com/javase/7/docs/api/java/io/InvalidClassException.htmlは、パラメータを受け付けないコンストラクタがない場合にこの例外がスローされることを示しています。しかし、私はこれらのコンストラクタを持っています。

答えて

4

あなたの問題は、クラスA.BSerializableである必要があります。そのインターフェイスを追加すると、オブジェクトの保存と復元の両方がうまくいくことができます。

ネストされたクラスを拡張するクラスをシリアル化すると(確かにコーナーケース!)、それ以外の場合は部分的なオブジェクトを持つため、親のメンバ変数にアクセスする必要があります。これには、親を直列化することが含まれます。

エラーメッセージは確かに優れている可能性があります。通常、「有効なコンストラクタはありません」は、循環依存関係が存在する場合、または引数なしのコンストラクタがない場合にのみ得られます。

関連する問題