バックグラウンド
シリアル化機能がオーバーライドされておらず、がないクラスがありますが、serialVersionUID
それでもシリアル化、保存、後で逆シリアル化されます。これは構成オブジェクトであり、構成を変更する場合、データは実際に構成UIから読み取られ、オブジェクトは通常「最初から」作成され、ストレージ用にシリアル化されます。使用する場合のみ、デシリアライズによってオブジェクトが作成されます。
これで、2つのフィールドがこのクラスに追加されました。これはシリアル化されるべきではありませんでしたが、...これはもちろん、いくつかの逆シリアル化の問題(デフォルトの逆シリアル化後にフィールドがnullのままになった場合のNullPointerException、クラスの不変条件の破損)につながり、構成を開くことで解決されますUIと構成の保存。これにより、オブジェクトの正しいシリアル化された形式が保存されます。
質問
ここで、保存された構成データからのオブジェクトの逆シリアル化で何が起こるか、これらの方法のいずれかでクラスを変更すると、簡単な修正が行われます。
- これらのフィールドを削除すると、保存されたデータは新しいバージョンであり、これらのフィールドが含まれていますか?
- これらのフィールドを一時的なものに変更すると、保存されたデータは新しいバージョンであり、これらのフィールドが含まれていますか?
- これらのフィールドを一時的なものに変更すると、保存されたデータは古いバージョンであり、これらのフィールドはありませんか?
これをより具体的にするために、追加されたフィールドが次のようになっているとしましょう。
private final Map<String, String> extraProperties = new HashMap<String, String>();
そして、これはこのクラスから削除されるか、private final transient
フィールドに変更されます。
PS。カスタムシリアル化コードを追加する必要があり、その後、永続データと一時データを異なるクラスに分離するために、すべてをリファクタリングする必要があることを私に伝える必要はありません...