Javaコンパイラがシリアルバーチョンの合成フィールドを作成するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/7389329

質問

アプリケーションのデバッグの一環として、私はそれに気づきました Field.getDeclaredFields() aを含むいくつかの合成フィールドを返します serialVersionUID インターフェイスを拡張するクラス内のフィールド。 Serializable.

コンパイラがそのようなフィールドを追加するのはなぜですか?

アップデート

実際、aもあります $VRc 作成された合成フィールド。

役に立ちましたか?

解決

Javaコンパイラ/ランタイムは、SerialVersionUidフィールドを自動的に作成しません。私は、実行時またはコンピレーション中に合成フィールドを追加するように指示されているフードの下で、何らかの形のバイトコードエンチェンスフレームワークを使用しているのではないかと思います。

$VRc フィールドはEMMAインストゥルメンテーションフレームワークによって生産されるため、少なくとも1つの合成フィールドの理由になります。

serialVersionUID フィールドもそうです エマによる追加, 、いつ instr.do_suid_compensation プロパティはTrueに設定されています。

他のヒント

このフィールドはJavaにとって不可欠です シリアル化. 。要するに、JVMがシリアル化されたクラス(ディスクに保存された)がその後変更され、オブジェクトに安全に戻ることができないことを発見することができます。

見て バージョン管理 上記のドキュメントの章では、どのように説明していますか serialVersionUID 使用されている。

更新:クラスが実装していないことに気付きました Serializable. 。スーパークラスや実装されたインターフェイスのどれも拡張していないことを確認してください Serializable?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top