【问题标题】:Properly obsoleting old members in an XML Serializable class in C# VB .NET在 C# VB .NET 的 XML Serializable 类中正确废弃旧成员
【发布时间】:2010-06-11 12:30:54
【问题描述】:

前段时间,我定义了一个使用 XML 序列化的类。该类包含整数类型的可序列化属性Alignment。现在我已经扩展和更新了这个类,其中添加了一个新属性Position,它的类型是另一个类,它也有几个可序列化的属性。新属性Position 现在应该承担旧Alignment 属性的角色,因为Position 属性的类型是另一个类,它的一个成员将包含以前包含在Alignment 中的值属性,从而使 Alignment 属性过时。

我想弄清楚的是如何确保当我反序列化此类的旧版本时(其中没有 Position 属性),我确保反序列化器将采用 Alignment 的值旧类中的属性并将其设置为新类中Position 属性的成员之一的值?

Private WithEvents _Position As Position = New Position(Alignment.MiddleMiddle, 0, True, 0, True)
Public Property Position() As Position 'NEW composite property that holds the value of the obsolted property, i.e. Alignment
    Get
        Return _Position
    End Get
    Set(ByVal value As Position)
        _Position = value
    End Set
End Property

Private _Alignment As Alignment = Alignment.MiddleMiddle
<Xml.Serialization.XmlIgnore(), Obsolete("Use Position property instead.")> _
Public Property Alignment() As Alignment 'The old, obsoleted property that I guess must be left for compliance with deserializing the old version of this class
    Get
        Return _Alignment
    End Get
    Set(ByVal value As Alignment)
        _Alignment = value
    End Set
End Property

抱歉,代码是用 VB 编写的,但它同样适用于 C# 和任何其他 .NET 语言。

你能帮帮我吗?

【问题讨论】:

    标签: c# .net xml serialization obsolete


    【解决方案1】:

    您可以使用 XMLSerializer 事件来帮助您:

    http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer_events.aspx

    代码如下:

        XmlSerializer xs = new XmlSerializer(typeof(MyClass));
        xs.UnknownAttribute += new XmlAttributeEventHandler(xs_UnknownAttribute);
        xs.UnknownElement += new XmlElementEventHandler(xs_UnknownElement);
        xs.UnknownNode += new XmlNodeEventHandler(xs_UnknownNode);
        xs.UnreferencedObject += 
           new UnreferencedObjectEventHandler(xs_UnreferencedObject);
    

    每个事件都有相应的事件参数,其中包含有关节点/属性/元素的非常详细的信息,因此足以让您确定要做什么。

    【讨论】:

      【解决方案2】:

      如果你的类实现了IXmlSerializable,你就可以实现你想要的,因为你现在可以完全控制你的类是如何序列化和反序列化的。这将允许您在新的 Position 属性之前处理序列化的对象,但是,实现 IXmlSerializable 是一种 PITA,因为它是一种全有或全无的方法。

      【讨论】:

        【解决方案3】:

        您可以保留 Alignment 属性并将其用作 Position 属性的别名。如果您用[ObsoleteAttribute] 标记它,这将警告您的类的用户该属性已过时且不应再使用。在某些时候,您可能会完全放弃对过时属性的支持。这解决了序列化和公共接口兼容性问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-23
          • 2013-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-24
          相关资源
          最近更新 更多