Правильно устаревшие старые члены в XML-сериализуемом классе в C # VB .NET - PullRequest
0 голосов
/ 11 июня 2010

Некоторое время назад я определил класс, который был сериализован с использованием 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.

Не могли бы вы мне помочь, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 12 июня 2010

Вы можете использовать события 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);

Каждое событие имеет соответствующие аргументы события с очень подробной информацией о рассматриваемом узле / атрибуте / элементе, поэтому более чем достаточно для вас, чтобы определить, что делать.

0 голосов
/ 12 июня 2010

Вы можете хранить свойство Alignment и использовать его в качестве псевдонима для свойства Position.Если вы отметите его [ObsoleteAttribute], это предупредит пользователей вашего класса, что свойство устарело и больше не должно использоваться.В какой-то момент вы можете полностью отказаться от поддержки устаревшего свойства.Это решает проблемы совместимости как с сериализацией, так и с общедоступным интерфейсом.

0 голосов
/ 12 июня 2010

Если ваш класс реализует IXmlSerializable , вы можете достичь того, чего хотите, поскольку теперь у вас есть полный контроль над сериализацией и десериализацией вашего класса. Это позволит вам обрабатывать объекты, сериализованные до нового свойства Position, однако реализация IXmlSerializable - это PITA, потому что это подход "все или ничего".

...