2016-12-28 4 views
-1

私はたくさんの検索をしていましたが、同じものについては妥当な答えを見つけることができませんでした。 なぜserialversionuidをdoubleにできないのですか? serialversionuidを長くする特別な理由は何ですか?SerialversionuidがJavaで長いのはなぜですか?

+3

double型のIDを持つのはなぜ便利でしょうか? – Hulk

+0

'Serializable'のjavadocはそう言いますか? – assylias

+0

'long'はより多くの精度を持つためです。 'long'は正確ですから。なぜなら、 'double'の小数部分は必要ないからです。なぜなら、「ダブル」が優れているとは思えないからです。 [Javadoc](http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html)と[オブジェクト直列化仕様(https://docs.oracle.com) /javase/8/docs/platform/serialization/spec/class.html)そうです。 – EJP

答えて

3

一意のIDは、通常、ランダムに選択された整数です。例えばUUIDは2つの長い値です。

Javaではすべての64ビット値が使用されているわけではなく、一部の値がそれ自体と等しくないなど、2重の使用はずっと困難です。 Double.NaN。ところで

あなたは本当にあなたがこの

private static final long serialVersionUID = Double.doubleToRawLongBits(1.28); 

を行うことができます。しかし、私が持っているだろうか値浮動小数点値を使用して知らないdoubleを使用する場合。あなたはバージョン番号をエンコードしたい場合は、この

private static final long serialVersionUID = MAJOR * 1000 + MINOR; 
0

Serializableのインスタンスを作成するとき、それは一般的なIDEまたはプログラマによって計算されたので、A UIDは、直列化のために指定されたコンテキストで一意である必要がありますものですを行うことができます。一意でなければならないものについては、longのデータ型が妥当と思われます。妥当なのは、暗黙的なデータ型であり、側面で最大のものであるdoubleです。データ型が大きいほど、一意のIDを生成する際の競合の可能性が低くなります。 (serialVersionUIDのデータ型としてbyteを使用すると想像してください。唯一のIDを生成するのに256の値しか使用できません。 doubleデータ型には、他の値と比較するための独自の問題があります。 longにはこのような問題はありません。他方、Stringまたは他の参照型を使用することは、空間および時間の複雑さの点で高価になる可能性があるため、適切でない可能性がある。これらの理由から、serialVersionUIDのデータ型として使用する場合は、longを適切な選択とします。

詳細については、this articleを参照してください。私は同じものからいくつかのビットを抽出しました。

各シリアライズクラスでシリアライズランタイム関連付けバージョン番号は、シリアル化されたオブジェクトの送信者と受信者がに関して互換性のあるそのオブジェクトのクラスをロードしたことを確認するために、逆シリアル化の間に使用されるのserialVersionUIDと呼ばシリアライゼーション。受信側が、対応する送信側のクラスと異なるserialVersionUIDを持つオブジェクトのクラスをロードした場合、非直列化によりInvalidClassExceptionが発生します。直列化可能クラスは、静的な最終でなければなりません「のserialVersionUID」という名前のフィールドを宣言することにより、独自のserialVersionUIDを明示的に宣言することができ、およびlong型:

ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L; 

は、直列化可能クラスが明示的にserialVersionUIDのが宣言されていない場合シリアライゼーションランタイムは、Java(TM)Object Serialization Specificationで説明されているように、クラスのさまざまな側面に基づいて、そのクラスのデフォルトのserialVersionUID値を計算します。ただし、デフォルトのserialVersionUIDの計算は、コンパイラの実装によって異なる可能性があるクラスの詳細に対して非常に敏感で、非直列化中に予期しないInvalidClassExceptionsが発生する可能性があるため、すべての直列化可能なクラスがserialVersionUID値を明示的に宣言することを強くお勧めします。したがって、異なるJavaコンパイラ実装間で一貫したserialVersionUID値を保証するためには、直列化可能クラスで明示的なserialVersionUID値を宣言する必要があります。また、明示的なserialVersionUID宣言は、可能であればprivate修飾子を使用することを強く推奨します。そのような宣言は、直ちに宣言するクラスにのみ適用されます - serialVersionUIDフィールドは、継承されたメンバーとしては有用ではありません。配列クラスは明示的なserialVersionUIDを宣言することはできません。したがって、それらは常にデフォルトの計算値を持ちますが、serialVersionUID値の一致要件は配列クラスに対しては放棄されます。