Java 仕様には次のように書かれています。
誰かがこれを掘り下げることができますか?getSerialVersionUID() メソッドはリフレクションを行います。リフレクションはどこでも一般的に使用されますが、コンパイラに依存するものは何ですか?
Java 仕様には次のように書かれています。
誰かがこれを掘り下げることができますか?getSerialVersionUID() メソッドはリフレクションを行います。リフレクションはどこでも一般的に使用されますが、コンパイラに依存するものは何ですか?
この質問の素晴らしい説明は、J. Bloch の本「Effective Java」にあります。
「項目 74: Serializable を慎重に実装する」:
serialVersionUID という名前の static final long フィールドを宣言してこの数値を明示的に指定しない場合、システムは複雑な手順をクラスに適用することによって実行時に自動的に生成します。自動生成された値は、クラスの名前、それが実装するインターフェイスの名前、およびそのすべてのパブリック メンバーと保護されたメンバーの影響を受けます。これらのいずれかを何らかの方法で変更すると (たとえば、簡単な便利なメソッドを追加するなど)、自動生成されたシリアル バージョンの UID が変更されます。
UPD :なぜそれがコンパイラに依存するのか、解説でも尋ねられました。実際、ここでのコンパイラ依存性は、getSerialVersionUID()
アルゴリズム自体に関するものではなく (メソッドは実行時に呼び出されます)、クラス自体の記述方法にあります。たとえば、いくつかの合成メソッドをコンパイル時にクラスに追加できます。これは SUID にもカウントされます。詳細については、 method ObjectStreamClass.computeDefaultSUID()
、それが行うこと、およびデフォルトの SUID を計算する方法を参照してください。