2013-05-08 3 views
6

私のサブクラスはSerializableを実装していますが、私のスーパークラスは実装していません。シリアル化でスーパークラスのフィールドを保存しますか?

サブクラスとスーパークラスの両方に、サブクラスの状態の一部として保存する必要のある変数が含まれています。

シリアル化でスーパークラスフィールドを保存しますか?

+0

http://stackoverflow.com/questions/8632148/java-object-serialization-and-inheritance –

答えて

3

スーパークラスがSerializableでない場合、フィールドはシリアル化されません。スーパークラスには引数なしのコンストラクタが必要です。

ドキュメントが言うように:直列化復元の際

、非直列化可能クラスのフィールドは、クラスのパブリックまたは保護された引数なしのコンストラクタを使用して初期化されます。引数なしのコンストラクタは、直列化可能なサブクラスにアクセス可能でなければなりません。

+0

どのように私は知っていますか? – Danijel

+0

どのインタフェースが実装されているかを確認できます。 –

+0

またはinstanceof演算子 – Amol

19

それはSerializable.Hereない場合は、スーパークラスのフィールドをシリアル化することはできませんがJavaの直列のいくつかのルールの概要です:

  • そのクラスまたはそのスーパークラスがSerializableを実装している場合にのみ、オブジェクトが直列化可能です(またはExternalizable)インターフェイスです。

  • スーパークラスが存在しない場合でも、オブジェクトはシリアル化可能です(それ自体がSerializableインターフェイスを実装します)。しかし、Serializableインタフェースを実装していない直列化可能クラスの階層のfirstsuperclassは、引数なしのコンストラクタを持っていなければなりません(MUST)。これに違反すると、readObject()は実行時にjava.io.InvalidClassExceptionを生成します。

  • 非直列化スーパークラスの引数なしコンストラクタは、オブジェクトが逆シリアル化されたときに実行されます。しかし、逆シリアル化されたオブジェクトは?デシリアライズ時にコンストラクタは実行されません。

  • クラスはシリアル化の時点で可視である必要があります。

  • すべてのプリミティブ型は直列化可能です。

  • 一時的なフィールド(一時的修飾子付き)はシリアル化されません(つまり、保存または復元されません)。 Serializableを実装するクラスは、直列化をサポートしないクラスの過渡フィールド(例えば、ファイルストリーム)をマークします。

  • 静的フィールド(静的修飾子付き)は直列化されません。

  • シリアライズ可能オブジェクトのメンバー変数が非シリアライズ可能オブジェクトを参照する場合、コードはコンパイルされますが、RumtimeExceptionがスローされます。スーパークラスがあるか `Serializable`ない場合

+0

を使用して確認できます。 – Danijel

+4

ソリューションをコピー&ペーストする場合は、ソースを提供してください(関心のある人はhttp://www.xyzws.com/Javafaq/what-are-rules-of-serialization-in-java/208) –

関連する問題