C # Контроль имени элемента при сериализации в XML - PullRequest
4 голосов
/ 16 мая 2011

У меня есть класс, который я хочу сериализовать в XML. Имя внешнего элемента класса при сериализации должно контролироваться приложением.

Во время разработки я знаю, что именем элемента можно управлять с помощью использования XmlTypeAttribute

 [XmlElement(Name="MyName")]

Мне нужно контролировать это во время выполнения, так что это не будет работать для меня.

Я также посмотрел на IXmlSerializable, чтобы создать свой собственный код сериализации, но опять-таки это не сработает, поскольку это позволяет управлять только внутренними объектами класса, а не внешней оболочкой.

Есть ли другие доступные варианты?

1 Ответ

2 голосов
/ 16 мая 2011

Да, как Cheeso указал в комментариях, вы можете сделать это, используя XmlAttributeOverrides

XmlAttributes overrideAttributes = new XmlAttributes();
overrideAttributes.XmlRoot = new XmlRootAttribute("Testing");

XmlAttributeOverrides overrides = new XmlAttributeOverrides();
overrides.Add(typeof(string[]), overrideAttributes);

XmlSerializer serialise = new XmlSerializer(typeof(string[]), overrides);

using (MemoryStream stream = new MemoryStream())
{
    serialise.Serialize(stream, new string[] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() });
}

Вывод:

<?xml version="1.0"?>
<Testing xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <string>37d47837-62d0-46dc-9747-709b91bdac6e</string>
  <string>9cd904a9-f86f-46c1-a2aa-49c44bc3c654</string>
</Testing>

XML-сериализация (примерно) работаетисходя из того, что:

  • Сериализуемый объект решает, как сериализуется его содержимое (включая атрибуты корневого элемента)
  • Однако вызывающий отвечает за создание корневого элемента (ипотребляя его при десериализации).

Это видно по тому, как работает интерфейс IXmlSerializable - Сериализуемый объект может использовать атрибут XmlRootAttribute в качестве подсказки вызывающей стороне о том, чтоКорневой элемент должен выглядеть следующим образом, однако в конечном итоге сам вызывающий пользователь должен создать корневой элемент (обычно обрабатываемый классом XmlSerializer).

...