アプリケーションのデバッグの一部として、Field.getDeclaredFields()
は、serialVersionUID
フィールドを含むインターフェイスを拡張するいくつかの合成フィールドを返しますが、どれもSerializable
はありません。なぜJavaコンパイラはserialVersionUID合成フィールドを作成しますか?
なぜコンパイラはこのようなフィールドを追加しますか?実際に
UPDATE
、作成$VRc
合成フィールドもあります。
アプリケーションのデバッグの一部として、Field.getDeclaredFields()
は、serialVersionUID
フィールドを含むインターフェイスを拡張するいくつかの合成フィールドを返しますが、どれもSerializable
はありません。なぜJavaコンパイラはserialVersionUID合成フィールドを作成しますか?
なぜコンパイラはこのようなフィールドを追加しますか?実際に
UPDATE
、作成$VRc
合成フィールドもあります。
Javaコンパイラ/ランタイムは、自動的にserialVersionUIDフィールドを作成しません。私は、実行時またはコンパイル中に合成フィールドを追加するように指示されている、フードの下でバイトコードエンハンスメントフレームワークのいくつかの形式を使用していると思われます。
フィールドはEmma計測フレームワークによって生成されるため、少なくとも1つの合成フィールドの理由になります。
instr.do_suid_compensation
プロパティがtrueに設定されている場合、フィールドもadded by Emmaです。
あなたは正しいです、私は確かにエマをテストカバレッジに使用しています。それを無効にすると、フィールドはもう存在しません。 – JVerstry
はい、特定のプロパティが設定されている場合、serialVersionUIDも[Emmaによって生成されます](http://emma.sourceforge.net/reference/ch03s02.html#prop-ref.instr.do_suid_compensation)です。 –
このフィールドは、Java serializationでは必須です。要するに、JVMは、直列化された(例えば、ディスクに保存された)クラスがその後変更されたことを発見し、オブジェクトに安全に逆直列化することができないことを発見することができる。
は、serialVersionUID
を使用する方法について説明し、上記引用された文書でバージョン管理章を見てください。
更新:あなたのクラスがSerializable
を実装していないことに気がつきました。スーパークラスも実装されたインターフェイスも、Serializable
を拡張していないと確信していますか?
私は、継承階層のどのクラスも 'Serializable'インターフェイスを実装していないときに、なぜフィールドが追加されたのかについて詳しく考えています。 –
はい、100%確実です。これは、クラスAと同様であり、Bはインタフェースとして宣言されています。 AとBはフィールド自体を宣言しません。それは..です(そして、これはシリアルバージョンUIDの意味/使用に関するものではありません)。 – JVerstry
あなたはどちらのコンパイラを使用していますか? –
私はjdk1.6.0_26にあります。 – JVerstry