これを行う最も簡単な方法は、古いメンバー変数を古いタイプで保持し、新しいタイプの新しいメンバー変数を追加することです。また、クラスのserialVersionUIDを同じに保つ必要があります。次に、readObject()実装は、古いデータを新しいデータに変換するために必要な操作を実行できます。
元のオブジェクト:
public class MyObject {
private static final long serialVersionUID = 1234L;
private int _someVal;
}
新しいバージョン:
public class MyObject {
private static final long serialVersionUID = 1234L;
private int _someVal; //obsolete
private String _newSomeVal;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException
{
in.defaultReadObject();
if(_someVal != 0) {
// translate _someVal to _newSomeVal
}
}
}
ObjectStreamField[] serialPersistentFields
カスタム、、ObjectInputStream.GetField
およびを使用することで、より複雑なオプションも利用できると思いますObjectOutputStream.PutField
。