2011-01-10 10 views
1

は、私は、インターフェイスがSerializableインターフェイスを拡張しないとクラスのいずれも、同様Serializableインタフェースを実装していない次のクラス階層にシリアライズ、コンパイルやバイトコードの生成

ParentInterface 

     | 
     v 
    ParentClass 

    / \ 
     v  v 

    SubClass1 SubClass2 

を持っています。すべてのクラスがコンパイルされ、jarファイルにパッケージ化されました。

ここでParentInterfaceを変更してSerializableインターフェイスにするように変更しました。この後は、jarファイルのParentInterface.classファイルのみを置き換えます。

SubClass1SubClass2のインスタンスをシリアライズしようとしているコードがあります。シリアル化しようとすると、私はNotSerializableExceptionを取得します。

私は、すべてのクラスを再度コンパイルして、自分のjarファイルで置き換えたとします。 ParentInterfaceだけを交換するとどうなりますか?

+3

再コンパイルでは動作しないと考えてください。試してみてください。 – skaffman

答えて

1

直列化可能なクラスのすべてのサブタイプは、それ自体が直列化可能です。

彼らは直列化可能ではありませんいくつかフィールドを、持っていない限りは、JavaDocによると、SubClass1とSubClass2は...シリアライズ可能でなければなりません。

SubClass1SubClass2のフィールドのシリアル対応性を再度確認してください。両方SubClass1SubClass2に含まれるフィールドに特に注意を払うことをお勧めとして

1

これは役立つかもしれない...

SubClass1SubClass2は、定義により

しかし、シリアライズされます。 JDKに記載されている以下の制限に注意してください。

非直列化可能クラスのフィールドは、クラスのpublicまたはprotected no-argコンストラクタを使用して初期化されます。引数なしのコンストラクタは、直列化可能なサブクラスにアクセス可能でなければなりません。直列化可能なサブクラスのフィールドはストリームから復元されます。

過渡として「非serialisable」フィールドを作るかのような適切な行動してください。

関連する問題