あなたはJava Object Serialization Specification、特にCompatible Java Type Evolutionセクションとすぐに次のセクションで、シリアル化に影響を与えるタイプの変更を読むことをお勧めします。
セクション1.10状態:シリアライズ可能なオブジェクトの場合
、十分な情報は、クラスの実装の異なる(しかし互換性のある)バージョンが存在する場合でも、これらのオブジェクトを復元するために維持されます。
開発者は、クラスの変更が以前のシリアル化されたバージョンと競合しないようにする責任があります。あなたが思うほど難しいことではありません。ほとんどの場合、回避する必要がありますincompatible changes:
- フィールドを削除しないでください。使用されなくなった場合は、deprecateです。これは、インスタンスフィールドを
static
フィールドにすることを含み、静的フィールドはシリアル化されないため、シリアル化に関してはこれを削除するのと同じです。
- フィールドのタイプを変更しないでください。
あなたのクラスにvoid writeObject(ObjectOutputStream)
メソッドを追加することによって、追加のデータを保存することができ、あなたはvoid readObject(ObjectInputStream)
メソッドを追加することによって、追加の初期化を実行することができます。これらは、documentation for Serializableに詳細に説明されています。これらのメソッドのコードの最初の行はそれぞれstream.defaultWriteObject()
とstream.defaultReadObject()
であることに注意してください。
readObject
は、フィールドを初期化する場合は、クラスにフィールドを追加するときに重要です。たとえば、あなたは常にnull以外になりたい新しいフィールドがある場合:完全にその場で解除 - つまり、それはなり直列化復元され、そのフィールドなく本シリアル化された
private List<String> names = new ArrayList<>();
どれでも古いインスタンスを(明示的に初期化されていない限り、オブジェクトが作成されたときにすべてのオブジェクトフィールドがnullになるため)nullのままです。あなたはこのことを考慮するreadObject
を使用することができます。
private void readObject(ObjectInputStream stream)
throws IOException,
ClassNotFoundException {
// First, do default serialization
stream.defaultReadObject();
if (this.names == null) {
this.names = new ArrayList<>();
}
}
出典
2016-09-08 15:02:05
VGR
これは、保存するデータの種類とアクセス方法によって異なります。 https://en.wikipedia.org/wiki/Object-relational_mapping –
JSON、XML、カスタムファイル形式、データベースなどを見てみたいかもしれません。あなたは選択肢があります。 –