- serialVersionUIDを static、final、および long 型の変数として宣言する必要があるのはなぜですか?
- この serialVersionUID は一意ですか?
- 2 つ以上のクラスに同じ serialVersionUID が含まれているとどうなりますか? この場合、バイト配列を逆シリアル化するために、この versionUID はどのように役立ちますか?
2 に答える
インスタンスではなくクラスに属しているため、静的です。
(そのバージョンのクラスでは) 変更されないため、これは最終的なものです。クラスがシリアライズされる方法に影響を与えるような変更を誰かがクラスに加えた場合にのみ変更されます。
データ型はシリアル化が容易で、コンパクトなスペースに収まり、誰もが必要とする可能性が高いよりも多くの値を持っているため、長いです。
一意である必要はありません。クラスの 2 つのバージョンが同じ serialversionUID を持っている場合、つまり、クラスのシリアル化方法に影響を与える変更がクラスにない場合、それらの 2 つのバージョンのクラスは同じシリアル化形式を受け入れることができます。
2 つのクラスが同じ serialVersionUID を持っているかどうかは問題ではありません。クラス間で使用されるのではなく、クラスのシリアル化されたバージョンがクラスのそのバージョンと互換性があるかどうかを確認するためにのみ使用されます。
- serialVersionUID を static、final、および long 型として宣言する必要があるのはなぜですか?
仕様がそう言っているからです。
- serialVersionUID は一意である必要がありますか?
いいえ。クラスの異なるバージョンを区別するだけです(たとえば、異なる時点でコンパイルされた)。新しいクラスを作成している場合は、 serialVersionUID = 1L;
何の問題もなく設定できます。
- 2 つ以上のクラスに同じ serialVersionUID が含まれているとどうなりますか? この場合、バイト配列を逆シリアル化するために serialVersionUID はどのように役立ちますか?
複数のクラスで同じ serialVersionUID を宣言できます。実際のワイヤ形式には完全修飾クラス名が含まれているため、あいまいさはありません。
ロードされるデータの serialVersionUID がクラスの serialVersionUID と一致しない場合、InvalidClassException
がスローされます。