2011-10-12 7 views
6

Serializableインターフェイスを実装するEclipseでJavaクラスを作成すると、警告が表示されますserialversionuidの計算方法

シリアル化可能なクラスABCDは静的な最終 serialVersionUIDフィールドをlong型宣言しません

警告、私はEclipseのオプションを

に与える

生成されたシリアルバージョンIDを追加する

このオプションを選択すると、Eclipseは自動的にserialVersionUID変数を作成します。

これで、その数がどのような数で生成されたのかを知りたかったのです。それは単なる任意の乱数ですか?自分の乱数を提供することはできますか?

答えて

12

クラス、フィールド、メソッドなどの構造に基づいて計算されます。正確な形式については、Object Serialization Specification-see this sectionで指定されています。

この仕様では、何も起こらないことが記述されていますが、自動生成では同じアルゴリズムが使用されています。次のように

ストリーム内の項目の順序は次のとおりです。

  • クラス名。
  • 32ビット整数として記述されたクラス修飾子。
  • 各インターフェイスの名前は名前でソートされています。
  • フィールド名でソートされたクラスの各フィールド(プライベートな静的フィールドとプライベートな一時フィールドを除く):*フィールドの名前 フィールドの修飾子は32ビット整数として記述されます。フィールドの名前
  • クラスの初期化子が存在する場合は、次のように記述します。*メソッド名。*メソッドの修飾子。 java.lang.reflect.Modifier.STATIC(32ビット整数として記述)。 * メソッドの記述子()V
  • メソッド名とシグネチャでソートされた非プライベートコンストラクタの場合:*メソッドの名前。* 32ビット整数として記述された メソッドの修飾子。 *メソッドの記述子。
  • メソッド名とシグネチャでソートされた非プライベートメソッドごとに:*メソッドの名前。 * 32ビット整数として記述されたメソッドの修飾子。 *メソッドの記述子。
4

自動的に生成serialVersionIdsは、クラス内のメソッドのシグネチャ、パラメータおよびそのような等に基づいてハッシュです。このようにして、クラスを変更するたびにserialVersionIdが変更され、データ/クラスがもはや互換性がないことを直列化メカニズムに示すことができます。これがデフォルトです。

自分で定義した場合は、1から始まり、クラスが以前にシリアル化されたデータと互換性がなくなると増分します。