2011-09-12 11 views
9

アプリケーションのデバッグの一部として、Field.getDeclaredFields()は、serialVersionUIDフィールドを含むインターフェイスを拡張するいくつかの合成フィールドを返しますが、どれもSerializableはありません。なぜJavaコンパイラはserialVersionUID合成フィールドを作成しますか?

なぜコンパイラはこのようなフィールドを追加しますか?実際に

UPDATE

、作成$VRc合成フィールドもあります。

+0

あなたはどちらのコンパイラを使用していますか? –

+0

私はjdk1.6.0_26にあります。 – JVerstry

答えて

11

Javaコンパイラ/ランタイムは、自動的にserialVersionUIDフィールドを作成しません。私は、実行時またはコンパイル中に合成フィールドを追加するように指示されている、フードの下でバイトコードエンハンスメントフレームワークのいくつかの形式を使用していると思われます。

フィールドはEmma計測フレームワークによって生成されるため、少なくとも1つの合成フィールドの理由になります。

instr.do_suid_compensationプロパティがtrueに設定されている場合、フィールドもadded by Emmaです。

+0

あなたは正しいです、私は確かにエマをテストカバレッジに使用しています。それを無効にすると、フィールドはもう存在しません。 – JVerstry

+0

はい、特定のプロパティが設定されている場合、serialVersionUIDも[Emmaによって生成されます](http://emma.sourceforge.net/reference/ch03s02.html#prop-ref.instr.do_suid_compensation)です。 –

1

このフィールドは、Java serializationでは必須です。要するに、JVMは、直列化された(例えば、ディスクに保存された)クラスがその後変更されたことを発見し、オブジェクトに安全に逆直列化することができないことを発見することができる。

は、serialVersionUIDを使用する方法について説明し、上記引用された文書でバージョン管理章を見てください。

更新:あなたのクラスがSerializableを実装していないことに気がつきました。スーパークラスも実装されたインターフェイスも、Serializableを拡張していないと確信していますか?

+3

私は、継承階層のどのクラスも 'Serializable'インターフェイスを実装していないときに、なぜフィールドが追加されたのかについて詳しく考えています。 –

+0

はい、100%確実です。これは、クラスAと同様であり、Bはインタフェースとして宣言されています。 AとBはフィールド自体を宣言しません。それは..です(そして、これはシリアルバージョンUIDの意味/使用に関するものではありません)。 – JVerstry

関連する問題