10

アプリケーションのデバッグの一環として、インターフェイスを拡張するクラスField.getDeclaredFields()のフィールドを含むいくつかの合成フィールドが返されることに気付きましたが、拡張するものはありません。serialVersionUIDSerializable

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

アップデート

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

4

2 に答える 2

11

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

$VRcフィールドは Emma インストルメンテーション フレームワークによって生成されるため、少なくとも 1 つの合成フィールドが存在するのはそのためです。

プロパティが true に設定されている場合、このserialVersionUIDフィールドはEmma によっても追加されます。instr.do_suid_compensation

于 2011-09-12T14:42:01.357 に答える
1

このフィールドは、Javaシリアライゼーションに不可欠です。つまり、シリアル化された (ディスクに保存された) クラスが後で変更され、オブジェクトに安全に逆シリアル化できないことを JVM が検出できるようになります。

上記のドキュメントのバージョン管理の章を見てくださいserialVersionUID。使用方法が説明されています。

更新: クラスが実装していないことに気付きましたSerializable。スーパークラスまたは実装されたインターフェースのどれも拡張されていませんSerializableか?

于 2011-09-12T14:21:21.490 に答える