Можно ли добавить атрибут [XmlElement] в члены списка, не нарушая обратную совместимость? - PullRequest
0 голосов
/ 31 января 2012

Я считаю следующее:

public List<Vector3> Vectors;

Будет сериализовано в:

<Vectors>
 <Vector3>
  <X>0</X>
  <Y>0</Y>
  <Z>0</Z>
 </Vector3>
</Vectors>

Я хочу удалить тег оболочки, который, как мне кажется, я могу сделать так:

[XmlElement("Vector3")]
public List<Vector3> Vectors;

Который должен сериализоваться в:

 <Vector3>
  <X>0</X>
  <Y>0</Y>
  <Z>0</Z>
 </Vector3>

Но я боюсь, что это сломает старые XML-файлы, которые все еще используют тег «Векторы» по всему списку. Есть ли общий способ решить эту проблему?

РЕДАКТИРОВАТЬ: приведенный выше список будет частью контейнерного объекта, поэтому полный XML может начинаться с

<Container>

и заканчивается

</Container>

Первоначально я оставил это, чтобы вопрос был короче.

1 Ответ

1 голос
/ 31 января 2012

Я не верю, что в XML есть какой-либо встроенный механизм управления версиями. Я думаю, что ваша лучшая ставка будет написание какого-то внешнего механизма, который может определить «версию», как вы ее определили, и десериализовать старую версию в ваш новый объект вручную. Возможно, вы также захотите определить новую переменную или свойство члена версии, которое будет сериализовано с вашим объектом на случай, если вы снова столкнетесь с той же проблемой, потому что, как только вы измените схему во второй раз, у вас будет 3 версии для беспокойства.

Вы можете либо написать собственный метод десериализации, определив IXmlSerializable для вашего объекта и определив функции readXml / writeXml, либо вы можете использовать какой-нибудь внешний процесс для генерации нового формата XML на основе старой версии. Возможно, сначала загрузите XML-файл в XmlDocument, исправьте его, как хотите (т.е. переместите узлы Vector3 на уровень выше и удалите узел Vectors), затем сохраните значение OuterXml документа в строку и десериализовайте с помощью MemoryStream.

...