2011-08-25 8 views
18

可能性の重複:
Why should I bother about serialVersionUID?JavaのserialVersionUIDとは何ですか、通常は例外クラスですか?

私はいくつかの例外処理コードを通過すると私はserialVersionUIDのという名前の何かを見ました。このuidは何ですか?それは例外に限定されているのですか、またはすべてのクラスで使用できますか?このidの利点は何ですか?

+5

ここをクリックしてください:http://stackoverflow.com/questions/285793/why-should-i-other-about-serialversionuid –

+3

これは良い、よく公式化された質問IMHOですが、すでに(ほとんど)上記のリンクにあります。それが「例外」に限定されているかどうかについては、答えは「いいえ」です。どのクラスでも使用できます。例外的に –

+0

はシリアライズ可能ではありません...その理由は? – amod

答えて

23

serialVersionUIDをあなたは多くのシリアル化が存在してもよいという意味いくつかの時間のために生産されている3つのフィールドを持つクラスEmployeeを(持っているシナリオを考え.. & deseriializingをseriializingしながら、特定のクラスのバージョンを定義するためのフィールドであり、バージョンの従業員オブジェクト)を含むクラスを更新すると(たとえば4番目のフィールド)、クラスを更新すると(シリアル化されている)以前のすべてのクラスを新しいクラスにキャストまたはデシリアライズすることはできません。

この問題を回避するには、serialVersionUIDフィールドを使用して、新しいクラスが異なるバージョンのものであることをJVMに通知します(serialVersionUIDを変更します)。

@Fomor & @Tom Jefferysはほとんど同じことを言っていましたが、例を挙げればもっと簡単に見えます。

+0

よく説明されています。この例では+1です。 –

6

シリアル化に使用されています。Serializableを実装するすべてのクラスで宣言する必要があります。

これは実質的に、シリアル化されたクラスが逆シリアル化しようとしているクラス定義と一致するかどうかを確認するためにJVMが使用できるバージョン番号です。

それについての詳細はこちらをあります:http://download.oracle.com/javase/1,5.0/docs/api/java/io/Serializable.html

2

それは、彼らが同じserialVersionUIDを持ち、両方の実装がSerializableその後、彼らは互換性がある場合、彼らは、シリアライズとdeserializable互換性を持っているかどうかを判断します。

Serializableを実装すると、日食が通常のJavaクラスの早い段階でserialVersionUIDになる傾向があることに気づくでしょう。

編集:Serializableインターフェイスに関する@Spychosのコメントが正しくありません。

+0

これは厳密に正しいわけではありません。オブジェクトは、そのスーパークラスの1つがシリアライザブルを実装する場合、シリアライズ可能です。 – Spycho

関連する問題