【问题标题】:Upgrading the serializer for an XML file升级 XML 文件的序列化程序
【发布时间】:2012-11-14 15:37:25
【问题描述】:

我正在对使用XmlSerializer 将XML 文件序列化/反序列化为类的旧应用程序进行修改。要求是在新的应用程序版本中更改某个属性,以便可以像以前一样加载旧文件,但是下次应该保留升级的(更通用的)属性。旧属性将在下次保存时被丢弃。

为了更好地解释它,文件是这样的:

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

新应用版本应正确加载文件,并在下次保存时将元素名称替换为新版本:

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

&lt;Data&gt; 元素具有更多属性,但这是需要更改的属性。此外,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 属性?

【问题讨论】:

    标签: c# .net xmlserializer


    【解决方案1】:

    一种方法是使用XmlAttributeOverrides。它可以帮助您覆盖 xml 序列化。希望对您有所帮助。

    XmlAttributeOverrides xmlAttributeOverrides = new XmlAttributeOverrides();
    
    //Add overrides to xmlAttributeOverrides, use sample from internet
    
    XmlSerializer serializer = new XmlSerializer(typeof(Data), XmlAttributeOverrides);
    

    【讨论】:

    • 谢谢,我刚刚看到在 MSDN 页面中提到了 XmlIgnore 作为在序列化或反序列化期间覆盖 XmlIgnore 的一种方式。如果我只能在序列化时忽略它,它可能会起作用。
    • [XmlIgnore] 属性用于忽略对象成员的序列化和反序列化(两者上)。它不能被调整为只做一种方式。祝你好运。
    • XmlAttributeOverrides 在每个 XmlSerializer 实例中实例化一次。所以,如果我只在序列化时指定它,它只会在保存文件时忽略该属性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多