2011-02-02 11 views
5

tengo una estructura más o menos así:¿Cómo puedo anular el nombre serializado de cada elemento de la lista en una lista <SomeStruct>() en C#?

[Serializable] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    string CustomerNo; 
    string Name; 
} 

veces serializar este esta estructura a XML como un objeto único, que funciona bien, pero a veces también necesito para serializar una lista <> de esta estructura .

he utilizado esto para establecer el nombre de elemento de nivel superior:

[Serializable] 
[XmlRoot("Customers")] 
public class CustomerList : List<TCustomer> { } 

XmlSerializer sin embargo, insiste en llamar cada elemento de la lista TCustomer. ¿Cómo puedo decirle a XmlSerializer que use el nombre Customer en lugar de TCustomer?

Respuesta

2

Gracias por todas las respuestas. La solución a mi problema específico sin embargo, resultó ser tan simple como:

[XmlRoot("Customers")] 
public class Customers 
{ 
    [XmlElement("Customer")] 
    public List<TCustomer> List = new List<TCustomer>(); 
} 
+0

¡Exactamente lo que estaba buscando! ¡Gracias! – Sergey

1

Nunca he intentado esto a nivel de clase/estructura, pero así es como lo hago cuando necesito serializar una lista dentro de una clase.

[XmlArray("ConfigurationList")] 
    [XmlArrayItem("Configuration")] 
    private List<string> pConfigList = new List<string>(); 
0

Puede implementar IXmlSerializable con el fin de personalizar la forma en que se serializa un objeto:

IXmlSerializable Interface

De todos modos, parece que serializador llama TCustomer el tipo de elementos, porque este es el tipo real de el List (TCustomer es ???, donde ??? será el tipo real del tipo de parámetro genérico TCustomer).

No cambiaría la forma en que XmlSerializer serializa objetos sin implementar IXmlSerializable (es decir, evitar una sustitución de texto posterior a la serialización o lo que sea).

7

creo que sirve

[XmlType("Customer")] 
[XmlRoot("Customer")] 
public struct TCustomer 
{ 
    public string CustomerNo; 
    public string Name; 
} 
+0

¡Bonito! Aunque sería bueno si pudieras explicarlo. –

+0

Controla el esquema XML que se genera cuando el destino de atributo se serializa por XmlSerializer. - http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmltypeattribute.aspx – Anuraj

+0

Esto es más apropiado: Inicializa una nueva instancia de la clase XmlTypeAttribute y especifica el nombre del tipo XML. - http://msdn.microsoft.com/en-us/library/573s2dsz.aspx – Anuraj

5

El atributo XmlRoot sólo se aplica para el elemento raíz, por lo que no se aplica para TCustomer cuando se está serializando CustomerList.

Sin implementar su propia serialización, no creo que pueda cambiar TCustomer para serializar como Customer dentro de la clase CustomerList. Pero se puede hacer algo como esto ...

[Serializable] 
[XmlRoot("customerList")] 
public class CustomerList 
{ 
    [XmlArray("customers")] 
    [XmlArrayItem("customer")] 
    public List<TCustomer> Customers { get; set; } 
} 

Eso debería darle XML similar a:

<customerList> 
    <customers> 
     <customer /> 
     <customer /> 
     <customer /> 
    </customers> 
</customerList> 

Esto cambia su CustomerList de una lista genérica, sino que le permite controlar su denominación.

+0

Todavía no he visto un caso donde la respuesta aceptada también funciona para serializar nombres de elementos para tipos estándar como 'List MyList'; sin embargo, esta respuesta es lo suficientemente flexible como para manejar el cambio de nombre de nombres de etiquetas secundarias en ese caso particular. Además, si solo necesita cambiar el nombre de las etiquetas de elemento de lista, me he dado cuenta de que solo se necesita '[XmlArrayItem (" customer ")]' – Henrik

Cuestiones relacionadas