10

Estoy interesado en la mejor manera de establecer los nombres de elementos personalizados al usar la Lista de primitivos con el DataContractSerializer. Digamos que tengo la siguiente clase que contiene una Lista de cadenas como un DataMember.Nombres de elementos personalizados usando DataContractSerializer en una lista de primitivos

[DataContract] 
public class ClassName 
{ 
    [DataMember] 
    public List<String> FieldName { get; set; } 
} 

Por defecto, esta serializa a lo siguiente:

<ClassName xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <FieldName xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
    <a:string>Value 1</a:string> 
    <a:string>Value 2</a:string> 
    <a:string>Value 3</a:string> 
    </FieldName> 
</ClassName> 

me gustaría hacer el XML lo más simple posible para transformar a través de XSLT por lo que idealmente me gustaría cambiar el nombre de las etiquetas en algo más útil, como el valor

Una posible solución implica la creación de una clase que amplíe la Colección y establezca el ItemName para el parámetro CollectionDataMember, que encontré here. Me preguntaba si había una manera de lograr el mismo objetivo sin la necesidad de una clase extra u otra forma de clase contenedora. El serializador XML hace uso de los parámetros XMLArray y XMLArrayItem para lograr esto, pero el DataContractSerializer no parece tener una funcionalidad similar.

¡Gracias por cualquier consejo o idea!

+0

Otra opción podría ser que se crea una clase llamada "Valor: String" que hereda de System.String y el uso que en el DataMember ... – Nabheet

+1

@NabheetSandhu 'System.String' está sellado. No puedes heredar de eso. –

Respuesta

0

Sus opciones son limitadas. DataContractSerializer no está diseñado para producir hermosos XML. Es utilizado por WCF, que no es de naturaleza humana. Por lo tanto, lo máximo que puede hacer es minimizar los elementos de uso y nombre del espacio de nombre definiendo un tipo personalizado con una propiedad de cadena.

7

Defina el contrato de datos para representar la lista de cadenas y úsela como un tipo para su propiedad FieldName. Luego puede usar el atributo CollectionDataContract para personalizar XML.

[CollectionDataContract(ItemName="Value")] 
public class MyList : List<string> {} 

[DataMember] 
public MyList FieldName { get; set; } 
+0

+1 - No sabía cómo hacer esto. Sin embargo, recientemente tuve que hacer esto y pasé de XSD a DataContract usando svcutil. Esto es más o menos lo que produjo svcutil. – Nabheet

Cuestiones relacionadas