2011-11-22 13 views
9

Necesito serializar IEnumerable. Al mismo tiempo, quiero que el nodo raíz sea "Canales" y el nodo de segundo nivel - Canal (en lugar de ChannelConfiguration).Reemplazar nombre de clase para XmlSerialization

Aquí es mi definición serializador:

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

He anulado nodo raíz proporcionando XmlRootAttribute pero no he encontrado una opción para configurar el canal en lugar de ChannelConfiguration como segundo nodo de nivel.

Sé que puedo hacerlo presentando un contenedor para IEnumerable y usando XmlArrayItem pero no quiero hacerlo.

+3

¿Por qué no quieren hacer la opción fácil? ¿por curiosidad? (Tenga en cuenta también que: el uso de constructores no triviales significa que ** debe ** almacenar en caché el serializador; de lo contrario, se producen ensamblados; el constructor 'XmlSerializer (Type)' básico no sufre esto) –

+0

¿Es usted dueño de la clase ChannelConfiguration? ¿puedes decorarlo con atributos? Si es así, probablemente tenga una solución. –

+0

@MarcGravell, puede que tengas razón y debería usar un contenedor – SiberianGuy

Respuesta

15

así:

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

Nota que necesidad caché y reutilización este caso serializador.

También diré que recomiendo encarecidamente que use el enfoque de "clase contenedora" - más simple, sin riesgo de fugas de ensamblaje, y IIRC funciona en más plataformas (bastante seguro de que he visto un caso marginal donde lo anterior se comporta de manera diferente en algunas implementaciones - SL o WP7 o algo así).

Si usted tiene acceso al tipo ChannelConfiguration, también puede simplemente usar:

[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

Esto debería hacer el truco, si no recuerdo mal.

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

} 
+1

Funciona solo si eres el propietario de la clase y puedes decorarla. –

+0

No, no :(XmlElement no se puede aplicar a una clase – SiberianGuy

+0

Creo que se dañó XmlRoot ("Channel")? –

Cuestiones relacionadas