0

前段时间我定义了一个使用 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 语言。

你能帮我吗?

4

3 回答 3

0

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

于 2010-06-12T11:17:57.877 回答
0

您可以使用 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);

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

于 2010-06-12T13:55:48.187 回答
0

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

于 2010-06-12T14:06:09.313 回答