アプリケーションのデバッグの一環として、インターフェイスを拡張するクラスField.getDeclaredFields()
のフィールドを含むいくつかの合成フィールドが返されることに気付きましたが、拡張するものはありません。serialVersionUID
Serializable
なぜコンパイラはそのようなフィールドを追加するのですか?
アップデート
$VRc
実際、作成された合成フィールドもあります。
アプリケーションのデバッグの一環として、インターフェイスを拡張するクラスField.getDeclaredFields()
のフィールドを含むいくつかの合成フィールドが返されることに気付きましたが、拡張するものはありません。serialVersionUID
Serializable
なぜコンパイラはそのようなフィールドを追加するのですか?
アップデート
$VRc
実際、作成された合成フィールドもあります。
Java コンパイラ/ランタイムは、serialVersionUID フィールドを自動的に作成しません。実行時またはコンパイル時に合成フィールドを追加するように指示されているフードの下で、何らかの形式のバイトコード拡張フレームワークを使用していると思われます。
$VRc
フィールドは Emma インストルメンテーション フレームワークによって生成されるため、少なくとも 1 つの合成フィールドが存在するのはそのためです。
プロパティが true に設定されている場合、このserialVersionUID
フィールドはEmma によっても追加されます。instr.do_suid_compensation
このフィールドは、Javaシリアライゼーションに不可欠です。つまり、シリアル化された (ディスクに保存された) クラスが後で変更され、オブジェクトに安全に逆シリアル化できないことを JVM が検出できるようになります。
上記のドキュメントのバージョン管理の章を見てくださいserialVersionUID
。使用方法が説明されています。
更新: クラスが実装していないことに気付きましたSerializable
。スーパークラスまたは実装されたインターフェースのどれも拡張されていませんSerializable
か?