2011-11-22 8 views
9

Potrzebuję serializować IEnumerable. W tym samym czasie chcę, aby węzeł główny był "Kanały", a węzeł drugiego poziomu - Kanał (zamiast KanałuKonfiguracyjnego).Zastąp nazwę klasy dla XmlSerialization

Oto moja definicja serializer:

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

Mam nadpisane węzeł główny dostarczając XmlRootAttribute ale nie znalazłem opcję, aby ustawić kanał zamiast ChannelConfiguration jako węzła drugiego poziomu.

Wiem, że mogę to zrobić, wprowadzając otoki dla IEnumerable i przy użyciu XmlArrayItem, ale nie chcę tego robić.

+3

dlaczego nie chcesz zrobić łatwą opcję? z ciekawości? (zauważ także: używanie nietrywialnych konstruktorów oznacza, że ​​** musisz ** buforować serializer, inaczej przeciekasz złożenia, podstawowy konstruktor 'XmlSerializer (Type)' nie cierpi tego) –

+0

Jesteś właścicielem klasy ChannelConfiguration, są jesteś w stanie udekorować go atrybutami? Jeśli tak, prawdopodobnie mam rozwiązanie. –

+0

@MarcGravell, może masz rację i powinienem użyć wrappera – SiberianGuy

Odpowiedz

15

tak:

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 { } }); 

Uwaga koniecznością cache i ponowne wykorzystanie to instancja serializer.

Powiem również, że zdecydowanie zalecam stosowanie podejścia "klasa opakowania" - prostsze, nie ma ryzyka wycieku z zestawu, a IIRC działa na większej liczbie platform (jestem pewien, że widziałem przypadek krawędziowy, w którym powyższe zachowuje się inaczej w niektórych implementacjach - SL lub WP7 lub coś podobnego).

Jeśli masz dostęp do rodzaju ChannelConfiguration, można też po prostu użyć:

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

var xmlSerializer = new XmlSerializer(typeof(List<ChannelConfiguration>), 
    new XmlRootAttribute("Channels")); 
xmlSerializer.Serialize(Console.Out, 
    new List<ChannelConfiguration> { new ChannelConfiguration { } }); 
11

To powinno załatwić sprawę, o ile dobrze pamiętam.

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

} 
+1

Działa tylko, jeśli posiadasz klasę i możesz ją ozdobić. –

+0

Nie, nie ma :(XmlElement nie może być zastosowany do klasy – SiberianGuy

+0

Myślę, że chodziło Ci o XmlRoot ("kanał")? –

Powiązane problemy