当前位置:  开发笔记 > 编程语言 > 正文

过时的属性导致XmlSerialization忽略属性

如何解决《过时的属性导致XmlSerialization忽略属性》经验,为你挑选了2个好方法。

我正在重构一些序列化为XML的对象,但需要保留一些属性以实现向后兼容性,我有一个方法可以将旧对象转换为新对象并使过时属性为空.我想使用该Obsolete属性告诉其他开发人员不要使用此属性,但它导致该属性被忽略XmlSerializer.

相似代码:

[Serializable]
public class MySerializableObject
{
    private MyObject _oldObject;
    private MyObject _anotherOldObject;

    private MyObject _newBetterObject;

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject OldObject
    {
      get { return _oldObject; }
      set { _oldObject = value; }
    }

    [Obsolete("Use new properties in NewBetterObject to prevent duplication")]
    public MyObject AnotherOldObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    }

    public MyObject NewBetterObject
    {
      get { return _anotherOldObject; }
      set { _anotherOldObject = value; }
    } 
}

关于变通方法的任何想法?我最好的解决方案是在XML注释中写出过时的...

更新:我正在使用.NET 2.0



1> user7116..:

编辑:在阅读MS Connect文章后,似乎.Net 2.0有一个"功能",它使ObsoleteAttribute等效于XmlIgnoreAttribute而没有在文档中发出任何通知.因此,我将修改我的答案,说在这种情况下获得蛋糕和吃它的唯一方法是遵循@Will的建议并手动实现序列化.这将是您在XML中包含过时属性的唯一未来证明方式.它在.Net 2.0中并不漂亮,但.Net 3.0+可以让生活更轻松.

来自XmlSerializer:

标记有过时属性的对象不再序列化在.NET Framework 3.5中,XmlSerializer类不再序列化标记为[已废弃]的对象.


将Obsolete和XmlIgnore的功能结合起来是一个多么糟糕的决定.他们有两个截然不同的目的.

2> Rolf Kristen..:

另一种解决方法是在为数据类型创建序列化程序时订阅XmlSerializer.UnknownElement,然后以这种方式修复旧数据.

http://weblogs.asp.net/psteele/archive/2011/01/31/xml-serialization-and-the-obsolete-attribute.aspx

也许考虑在类的数据类型上使用方法作为静态方法进行订阅.

static void serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
    if( e.Element.Name != "Hobbies")
    {
        return;
    }

    var target = (MyData) e.ObjectBeingDeserialized;
    foreach(XmlElement hobby in e.Element.ChildNodes)
    {
        target.Hobbies.Add(hobby.InnerText);
        target.HobbyData.Add(new Hobby{Name = hobby.InnerText});
    }
}

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有