Переопределить имя класса для XmlSerialization - PullRequest
10 голосов
/ 22 ноября 2011

Мне нужно сериализовать IEnumerable. При этом я хочу, чтобы корневым узлом были «Каналы», а узлом второго уровня - Канал (вместо ChannelConfiguration).

Вот мое определение сериализатора:

_xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), new XmlRootAttribute("Channels"));

Я переопределил корневой узел, предоставив XmlRootAttribute, но я не нашел возможности установить Channel вместо ChannelConfiguration в качестве узла второго уровня.

Я знаю, что могу сделать это, представив оболочку для IEnumerable и используя XmlArrayItem, но я не хочу этого делать.

Ответы [ 2 ]

17 голосов
/ 22 ноября 2011

Вроде так:

XmlAttributeOverrides or = new XmlAttributeOverrides();
or.Add(typeof(ChannelConfiguration), new XmlAttributes
{
    XmlType = new XmlTypeAttribute("Channel")
});
var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), or,
     Type.EmptyTypes, new XmlRootAttribute("Channels"), "");
xmlSerializer.Serialize(Console.Out,
     new List<ChannelConfiguration> { new ChannelConfiguration { } });

Обратите внимание, что необходимо кэшировать и повторно использовать этот экземпляр сериализатора.

Я также скажу, что я настоятельно рекомендую вам использовать подход «класса-оболочки» - проще, нет риска утечки сборки, и IIRC работает на большем количестве платформ (почти наверняка я видел крайний случай, когда вышеописанное ведет себя иначе в некоторых реализациях - SL или WP7 или что-то в этом роде.

Если у вас есть доступ к типу ChannelConfiguration, вы также можете просто использовать:

[XmlType("Channel")]
public class ChannelConfiguration
{...}

var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>),
     new XmlRootAttribute("Channels"));
xmlSerializer.Serialize(Console.Out,
     new List<ChannelConfiguration> { new ChannelConfiguration { } });
12 голосов
/ 22 ноября 2011

Это должно сработать, если я правильно помню.

[XmlType("Channel")] 
public class ChannelConfiguration {

}
...