serialize serializar deserialize deserializar data and c# xml wcf serialization datacontract

serializar - serialize and deserialize c#



Serialización XML de DataContract y atributos XML (2)

¿Es posible deserializar este XML en un objeto marcado con el atributo DataContract?

<root> <distance units="m">1000</distance> </root>

Como puede ver, hay un atributo de "unidades". No creo que sea compatible. ¿O estoy equivocado?


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

Entonces, 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.


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 siguiente estructura de clases le dará el resultado que busca:

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

Puedes probar esto 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();

El resultado 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>