回答編集履歴

1

ドキュメントでの記載

2015/10/27 12:46

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -3,3 +3,19 @@
3
3
  ![イメージ説明](b88ba5709960e9fcc344b23c65a0f211.png)
4
4
 
5
5
  Serializableを実装したクラスでは,シリアライズした時とデシリアライズした時のバージョンの違いを判別するために,static finalでlong型のserialVersionUIDというフィールドを宣言することを推奨されるのです.
6
+
7
+
8
+
9
+ [JavaのSerializableインタフェースのドキュメント](https://docs.oracle.com/javase/jp/8/api/java/io/Serializable.html)にはこのような記載があります.
10
+
11
+ > 直列化ランタイムは、各直列化可能クラスにバージョン番号 serialVersionUID を関連付けます。これは、直列化復元中に、直列化オブジェクトの送信側と受信側が、直列化に関して互換性のあるオブジェクトのクラスをロードしたかどうかを確認するために使われます。対応する送信側のクラスとは異なる serialVersionUID を持つオブジェクトのクラスを受信側がロードした場合、直列化復元では InvalidClassException が発生します。フィールド名 "serialVersionUID" を宣言することによって、直列化可能クラスは独自の serialVersionUID を明示的に宣言できます。このフィールド名は、次のように static、final、および long 型である必要があります。
12
+
13
+ >
14
+
15
+ > static final long serialVersionUID = 42L;
16
+
17
+ >
18
+
19
+ > 直列化可能クラスが serialVersionUID を明示的に宣言しない場合、直列化ランタイムは「Java(TM) オブジェクト直列化仕様」で説明されているように、クラスのさまざまな側面に基づいて、クラスの serialVersionUID のデフォルト値を計算します。ただし、すべての直列化可能クラスが serialVersionUID 値を明示的に宣言することを強くお勧めします。これは、デフォルトの serialVersionUID の計算が、コンパイラの実装によって異なる可能性のあるクラスの詳細にきわめて影響を受けやすく、直列化復元中に予期しない InvalidClassException が発生する可能性があるためです。したがって、java コンパイラの実装が異なっても serialVersionUID 値の一貫性を確保にするには、直列化可能クラスが serialVersionUID 値を明示的に宣言しなければいけません。また、serialVersionUID の明示的な宣言では private 修飾子を使用することを強くお勧めします。このような宣言は直接的に宣言するクラスにのみ適用されるためです。つまり、serialVersionUID フィールドは継承されるメンバーのように使いやすくありません。配列クラスは serialVersionUID を明示的に宣言できないため、常にデフォルトの計算値を持ちますが、配列クラスに関しては serialVersionUID 値の一致要件は適用されません。
20
+
21
+