Serializable UID整合性の問題
767 ワード
Javaオブジェクトをローカルに存在させる場合、またはローカルからメモリに読み込まれるオブジェクトのクラスはserializableインタフェースを実装する必要があります.実際には、インタフェースには方法の宣言はありません.jvmによって特殊に処理できるフラグとして、インタフェースを実装するクラスごとにUID(stream unique identifier)がクラスの唯一のフラグとして使用されています.このUIDはクラス名,メソッド名など多くの要因により算出され,そのクラスとは一対一に対応する関係である.UIDが対応していなければ逆シーケンス化は実現しない.次のような異常が発生します
以上から分かるように、ローカルにオブジェクトをシーケンス化した後、シーケンス化されたクラスに関連するフィールドやメソッドを追加または削除しないようにし、変更する必要がある場合はシーケンス化操作を再開する必要があります.
もう1つのケースでUIDが一致しにくいのは、分布式をするときに、UIDが指定されていないときはjvmがクラスの関連属性に基づいて自動的に生成するので、同じjvmを選択することが前提なので、分布式をするときはできるだけ同じjvmを選択するようにしましょう
java.io.InvalidClassException: com.java.model.User; local class incompatible: stream classdesc
serialVersionUID = -405990810656876143, local class serialVersionUID = 875403040358241326
以上から分かるように、ローカルにオブジェクトをシーケンス化した後、シーケンス化されたクラスに関連するフィールドやメソッドを追加または削除しないようにし、変更する必要がある場合はシーケンス化操作を再開する必要があります.
もう1つのケースでUIDが一致しにくいのは、分布式をするときに、UIDが指定されていないときはjvmがクラスの関連属性に基づいて自動的に生成するので、同じjvmを選択することが前提なので、分布式をするときはできるだけ同じjvmを選択するようにしましょう