Добавить новые элементы XML и все еще читать старые версии документа XML - PullRequest
2 голосов
/ 26 апреля 2011

В версии 1 моего приложения у меня есть XML-документ, который выглядит следующим образом:

<settings>
  <background>black</background>
</settings>

С элементом, который я сериализую и десериализирую следующим образом:

[XmlElement("background")]
public string XMLbackground {
    get { return backgroundcolor; }
    set { backgroundcolor = value; }
}

Но теперьв версии 2 я хочу добавить новые подэлементы к элементу фона:

<settings>
  <background>
    <color>black</color>
    <angle>62</angle>
  </background>
</settings>

Это означает, что элемент фона больше не строка, а класс.

[XmlElement("background")]
public BackgroundSettings background = new BackgroundSettings();

//...

public class BackgroundSettings
{

[XmlElement("color")]
public string XMLcolor {
    get { return backgroundcolor; }
    set { backgroundcolor = value; }
}

[XmlElement("angle")]
public string XMLangle {
    get { return backgroundangle; }
    set { backgroundangle = value; }
    }
}

Как сделатьЯ продолжаю читать документ XML версии 1 с тем же кодом, который теперь создает и читает формат версии 2, используя стандартную разметку сериализации .NET?

1 Ответ

1 голос
/ 26 апреля 2011

Я бы сказал, что было бы неплохо добавить «version = x» в корень документа и проверить это перед десериализацией.Затем вам нужно сохранить две версии объектов данных в вашем коде - ConfigV1 и ConfigV2.На основании значения "version = x" десериализовать xml в экземпляр ConfigV1 или ConfigV2.Реализуйте ручное преобразование из ConfigV1 в ConfigV2, который вызывается в случае, если объект был ConfigV1.

Если вы только добавляете поля, это не нужно, поскольку десериализация должна просто пропускать поля, отсутствующие в xml иоставьте значения по умолчанию.

В качестве альтернативы, вы можете реализовать пользовательскую десериализацию, реализовав ISerializable и конструктор (я не пробовал, вам бы пришлось попробовать это самостоятельно):

Config(SerializationInfo info,StreamingContext context) {
    this.angle = info.GetString("angle");
    ...
}
...