わかりましたので、以下に概説するようなクラスがあるとしましょう。
[serializable]
class foobar
{
const int version =1;
List<Object> Bar;
<methods etc n stuff>
}
わかりました、とても簡単です。
次に、バージョン 2 のリリースで新しいメンバーを追加します。
[serializable]
class foobar
{
const int version =2;
List<Object> Bar;
public string NickName;
<methods etc n stuff>
}
わかりました、今私は本当にいたずらなことをします。実際には、Bar をリストにするのではなく、いくつかの追加機能または非表示機能を備えたカスタム リストのようなものにしたいと判断しました。だから私はこれをします:
[serializable]
class foobar
{
const int version =3;
FooList BarList;
public string NickName;
<methods etc n stuff>
}
わかりました、このままでは機能しません。そのため、カスタムのシリアライゼーションを実装し、手動で新しいバーリストをデシリアライズされたリストに設定し、ニックネームも手動で読み取ります。これまでのところ、すべてがうまくいっています。
しかし、バージョン 4 が登場したので、別のメンバー パラメーターを追加します。(おそらく)実際には決して使用されない古い間違いをサポートするために、ますます複雑になるシリアライズとデシリアライズの一連のメソッドを使用して、すべてのパラメータを手動でシリアライズおよび手動で復元する必要があります。
私の質問は次のとおりです。
シリアライゼーションで元の get object data メソッドを呼び出すことは可能ですか? つまり、私が理解しているように、これを行うロジックが少しあります
If(object implements ISerializable)
object.serialize
else
SerialzeUsingReflection(object) //The "original" way
次に、バージョンに基づいてカスタム逆シリアル化を決定できますか、または「欠落している」データ属性がないことがわかっている場合は、元の逆シリアル化メソッドを呼び出すことができますか?
私のデシリアライズで例えば
if(version ==2)
{
... //do all the deserialise manually
}
else
{
CallFrameworkOriginalMethod();
}
どうもありがとう。