7

私は次のような状況にあります。私のC#アプリケーションには、XmlSerializerを使用してシリアル化するクラスがあります。クラスはかなり複雑で、私のクラスのオブジェクトは、後で開くことができるアプリケーションファイルとしてローカルディスクに保存されます(従来の保存作業と再開作業)。私の問題は、開発中に、シリアル化されるオブジェクトのクラスが変更される可能性があることです。保存したxmlが古いバージョンに属しているが、それでも開くことができることをアプリが認識できるようにするバージョンシステムが必要です。古いアプリバージョンでは、新しいxmlバージョンも開くことができません。

例えば:

class ComplexObject
{
   public string settings1;
   public string settings2;
}

オブジェクトをシリアル化し、アプリを本番環境に送信します。明日私のクラスは

class ComplexObject
{
   public string settings1;
   public string settings2;
   public string settings3;
}

私の新しいバージョンのアプリは、古いクラス定義のシリアル化されたオブジェクトと、オブジェクトへのファイルのロード(逆シリアル化)でエラーなしで新しいクラス定義をどのように開きますか?

任意の提案や基本的なサンプルを歓迎します!

ありがとう

4

4 に答える 4

6

それはすべてシリアライザーの選択に依存します。この場合XmlSerializerは問題なく機能します。新しい値を持つクライアントは新しい値をロードします。ないクライアントはしません。サンプル:

var reader = XmlReader.Create(new StringReader(
    @"<ComplexObject><foo>123</foo><bar>abc</bar></ComplexObject>"));
var ser = new XmlSerializer(typeof (ComplexObject));
var obj = (ComplexObject)ser.Deserialize(reader);

と:

public class ComplexObject
{
    public string foo;
}

これは機能してロードされますが、ロードさfooれませんbar

これには使用しないでくださいBinaryFormatter-それは傷ついた世界につながります。バイナリ出力が必要な場合は、バージョン管理に明確に対応するように設計されたprotobuf-netのようなものを検討してください。

于 2012-08-01T10:00:39.313 に答える
3

バージョントレラントなシリアル化

つまり、フィールドにマークを付けるOptional(そしてデフォルト値で埋める)か、必要に応じて値を解析する逆シリアル化コンストラクターを実装します。

于 2012-08-01T09:57:57.000 に答える
2

私はあなたの問題を正しく理解したと思います。クラスをファイルにシリアル化しています。次に、メモリ内のクラスを変更します(たとえば、別のプロパティを追加します)。いいえ、このクラスをファイルから逆シリアル化します。新しいプロパティを追加するだけであれば、これは問題ありません。それらはデシリアライザーによって無視されます。彼はクラスの新しいインスタンスを作成し(これが、シリアル化可能なクラスにデフォルトのコンストラクターが必要な理由です)、ストリームで見つけたプロパティを埋めて逆シリアル化しようとします。プロパティのタイプを変更したり、プロパティを削除したりすると、それを逆シリアル化することはできません。

「プロパティの削除」の回避策の1つは、意図的に削除したいプロパティを保持し、それらをさらに無視することです。

msdnhttp://msdn.microsoft.com/en-us/library/ms229752%28v=vs.80%29.aspxで説明されているバージョントレラントシリアル化を確認できます

于 2012-08-01T09:55:57.670 に答える
0

トラック1

if..else可能な限り低いバージョンから高いバージョンにファイルを開こうとする新しいバージョンのファイルオープナーのメカニズムを作成できます。

トラック2

バージョン情報をファイルに保存できます。

class ComplexObject
{
   public string settings1;
   public string settings2;
   public string fileVersion;
}

トラック3

ファイルバージョンごとに異なるファイル拡張子を使用できます(.doc、.docxなど)

于 2012-08-01T09:53:44.280 に答える