2

わかりましたので、以下に概説するようなクラスがあるとしましょう。

[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();
}

どうもありがとう。

4

1 に答える 1

0

説明したバージョン管理を実行できますが、留意する必要がある重要な点が 2 つあります。

まず、OptionalFieldAttribute の「VersionAdded」プロパティを使用しないでください。msdnでは、「このプロパティは使用されておらず、予約されています」と明確に述べていますこれは重要な情報です。なぜなら、まず、フレームワークのドキュメントに何かが予約されていると書かれている場合は、それを避けなければならないからです。2 つ目は、フレームワークのドキュメントには使用されていないと書かれているため、そのまま使用したとしても、動作することを期待すべきではありません。msdn に別のページがあります。これは、「バージョン トレラント シリアル化」がどのように機能するか、および VersionAdded プロパティを正確に使用する方法を説明しています。ただし、これは、最初にどのように機能するかの仕様を書いたが、実際に実装に取り​​掛かることができなかった場合です - ページによると、VersionAdded はバージョン 2.0 の .NET で追加されているはずです。これは発生しましたが、シリアル化フレームワークでそのプロパティに関連付けられたロジックはありませんでした。現在はバージョン 4.5 ですが、そのロジックはまだ実装されていません。「sharpserializer」などのサードパーティのユーティリティを使用する場合、またはこれを自分で作成する場合に応じて、STEER CLEAR を使用して別のものを使用してください。

次に、元の get object data メソッドを呼び出すことができるかどうかを尋ねます。答えはノーです。オブジェクトをシリアル化すると、書き込まれるのはフィールドで実証された状態だけです。メソッド本体からの IL は含まれません。

于 2013-09-12T05:33:15.057 に答える