Javaコンパイラがシリアルバーチョンの合成フィールドを作成するのはなぜですか?
-
29-10-2019 - |
質問
アプリケーションのデバッグの一環として、私はそれに気づきました Field.getDeclaredFields()
aを含むいくつかの合成フィールドを返します serialVersionUID
インターフェイスを拡張するクラス内のフィールド。 Serializable
.
コンパイラがそのようなフィールドを追加するのはなぜですか?
アップデート
実際、aもあります $VRc
作成された合成フィールド。
解決
Javaコンパイラ/ランタイムは、SerialVersionUidフィールドを自動的に作成しません。私は、実行時またはコンピレーション中に合成フィールドを追加するように指示されているフードの下で、何らかの形のバイトコードエンチェンスフレームワークを使用しているのではないかと思います。
$VRc
フィールドはEMMAインストゥルメンテーションフレームワークによって生産されるため、少なくとも1つの合成フィールドの理由になります。
serialVersionUID
フィールドもそうです エマによる追加, 、いつ instr.do_suid_compensation
プロパティはTrueに設定されています。
他のヒント
このフィールドはJavaにとって不可欠です シリアル化. 。要するに、JVMがシリアル化されたクラス(ディスクに保存された)がその後変更され、オブジェクトに安全に戻ることができないことを発見することができます。
見て バージョン管理 上記のドキュメントの章では、どのように説明していますか serialVersionUID
使用されている。
更新:クラスが実装していないことに気付きました Serializable
. 。スーパークラスや実装されたインターフェイスのどれも拡張していないことを確認してください Serializable
?