4

XmlSerializerXMLファイルをクラスにシリアル化/逆シリアル化するために使用するレガシーアプリに変更を加えています。要件は、新しいアプリバージョンで特定のプロパティを変更して、以前と同じように古いファイルを読み込むことができるようにすることですが、アップグレードされた(より一般的な)プロパティは次回も保持する必要があります。その後、古いプロパティは次の保存時に破棄されます。

もう少し詳しく説明すると、ファイルの外観は次のようになります。

<Data>
   <ImportantAnalysisResults>
        <ImportantAnalysisResult>...</ImportantAnalysisResult>
        <ImportantAnalysisResult>...</ImportantAnalysisResult>
        <ImportantAnalysisResult>...</ImportantAnalysisResult>
   </ImportantAnalysisResults>
</Data>

新しいアプリのバージョンでは、ファイルが正しく読み込まれ、次の保存時に要素名が新しいものに置き換えられます。

<Data>
   <Results>
        <Result>...</Result>
        <Result>...</Result>
        <Result>...</Result>
   </Results>
</Data>

<Data>要素にはさらに多くのプロパティがありますが、これは変更する必要があるものです。また、ImportantAnalysisResultから継承しResultます。

私のDataクラスでは、次のようなことを試みました。

class Data 
{ 
    [Obsolete("Used for backward compatibility. Use Results instead.")]
    [XmlArrayItem("ImportantAnalysisResult", typeof(Result))]
    public List<Result> ImportantAnalysisResults
    {
        get { return _results; }
    }

    public List<Result> Results 
    {
        get { return _results; }
    }
}

ただし、これでも古いプロパティが新しいファイルに保存されます。ImportantAnalysisResults次の保存時に非表示にするための最良の方法は何 ですか?

Resultsロード中に古いプロパティを新しいプロパティに単純に「マップ」する方法はありますか?

4

1 に答える 1

1

これを行う1つの方法は、XmlAttributeOverridesを使用することです。これは、xmlシリアル化をオーバーライドするのに役立ちます。それが役に立てば幸い。

XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides();

//Add overrides to xmlAttributeOverrides, use sample from internet

XmlSerializer serializer = new XmlSerializer(typeof(Data), XmlAttributeOverrides);
于 2012-11-14T17:02:43.680 に答える