2011-02-01 22 views

Respuesta

49

Esto se puede lograr, pero deberá sobrescribir el serializador predeterminado aplicando el atributo [XmlSerializerFormat] al DataContract. Aunque se puede hacer, esto no funciona tan bien como el serializador predeterminado, así que úselo con precaución.

La estructura de clases siguiente le dará el resultado que está buscando:

using ... 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Xml.Serialization; 

[DataContract] 
[XmlSerializerFormat] 
public class root 
{ 
    public distance distance=new distance(); 
} 

[DataContract] 
public class distance 
{ 
    [DataMember, XmlAttribute] 
    public string units="m"; 

    [DataMember, XmlText] 
    public int value=1000; 
} 

Esto se comprueba con el siguiente código:

root mc = new root(); 
XmlSerializer ser = new XmlSerializer(typeof(root)); 
StringWriter sw = new StringWriter(); 
ser.Serialize(sw, mc); 
Console.WriteLine(sw.ToString()); 
Console.ReadKey(); 

la salida será:

<?xml version="1.0" encoding="utf-16"?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <distance units="m">1000</distance> 
</root> 
+9

Si está buscando el atributo XmlSerializerFormat, puede encontrarlo en el espacio de nombres System.ServiceModel: http://msdn.microsoft.com/en-us/library/system.servicemodel.xmlserializerformatattribute%28v=VS.90 % 29.aspx – jeffreypriebe

+1

Claro, eso funciona para la codificación, me gusta leer la lectura de los documentos :) – jeffreypriebe

+0

@GregSansom, que asume que ya ha agregado la referencia. La resolución no aparece como una opción si no lo ha hecho. –

24

El serializador de contrato de datos utilizado por defecto en WCF hace no admite atributos XML por motivos de rendimiento (el DCS es aproximadamente un 10% más rápido en promedio que el serializador XML).

Así que si realmente quieres usar el DCS, no puedes usar esta estructura que tienes - debería cambiarse.

O necesita usar el XmlSerializer con WCF, como mostró Greg en su respuesta, eso también funciona, pero pierde el beneficio de rendimiento (más todos los demás beneficios) del DCS.