2009-03-08 21 views
5

Como parte de intentar aprender WCF, estoy leyendo sobre la serialización. Me cuesta entender cómo puedo controlar la serialización en .NET 3.5. Por ejemplo, tengo una clase simple con algunas propiedades públicas. Al agregar el atributo DataContract a esa clase, puedo, por ejemplo, controlar el espacio de nombre y el nombre de la clase a medida que se serializa.DataContract frente a XmlType

Por otro lado, podría agregar el atributo Serializable (probablemente ni siquiera sea necesario) y un atributo XmlType, que también me permite controlar el espacio de nombres y el nombre que se utiliza para serializar la clase.

Implementé ambos enfoques y uso la clase en un ServiceContract como parte de una llamada de interfaz. Luego utilizo un analizador Http para ver cómo se estratifican los diversos objetos y noté que el XmlType no influía en absoluto en el xml del http.

He estado tratando de entender esto todo el día. ¿Qué me estoy perdiendo?

Actualización: Entiendo la diferencia entre los dos y por qué están allí. Simplemente no entiendo por qué no puedo influir en el xml generado con XmlType o (lo intenté con XmlRoot).

Básicamente, puede controlar todos los detalles de la serialización implementando IXmlSerializable, excepto los espacios de nombres y el nombre del elemento de nivel superior. Para eso, estaba asumiendo que necesitaría el atributo XmlType o XmlRoot. ¿Estaba equivocado?

+1

XmlRoot, XmlType y IXmlSerializable están todos relacionados con el serializador XML y no tienen ningún efecto en la serialización de los contratos de datos. –

+0

Ver [datacontractserializer-vs-xmlserializer-pros-and-cons?] (Http://stackoverflow.com/questions/2505778/datacontractserializer-vs-xmlserializer-pros-and-cons-of-each-serializer?) – nawfal

Respuesta

1

Ver XmlSerializer vs DataContractSerializer: Serialization in Wcf.

Editar:

Ver Customize your .NET object XML serialization with .NET XML attributes. Obtenga sus datos para serializarlos en la forma que desee primero. A continuación, coloque el atributo XmlSerializerFormat.

[ServiceContract] 
[XmlSerializerFormat] 
public interface MyService 
{ 
    [OperationContract] 
    [XmlSerializerFormat] 
    void MyMethod(); 
} 
+0

I Leí ese artículo hoy, pero no menciona el atributo XmlType en absoluto. Sí dice que puede usar el atributo XmlRoot para cambiar el nombre y el espacio de nombres, pero tampoco puedo hacerlo funcionar. – Bernie

5

El punto principal de la DataContractSerializer es no controlar los detalles de serialización. En cambio, la idea es serializar sus datos en una forma que pueda ser consumida por la mayor cantidad de clientes.

En lugar de preocuparse por los detalles del esquema, se define un contrato de datos en términos de los miembros de datos que se enviarán y recibirán. Es una descripción muy abstracta de los datos. Se serializa en un formato muy simple que refleja la descripción abstracta.

El serializador XML debe usarse solo cuando se requiera el control absoluto de los detalles del XML a serializar o deserializar. Cuando no necesita tanto control, quédese con el serializador de contrato de datos.

0

Bueno, hay muchas comparaciones en DataContractSerializer vs. XmlSerializer.

supongo que los puntos principales en mi opinión son los siguientes:

  • DataContract es "opt-in" - es necesario agregar explícitamente un atributo [DataMember] a cualquier campo o propiedad (pública, privada, interna o lo que sea) para serializar, si no tienes, no estará allí.XmlSerializer se acaba de serializar todas las propiedades públicas

  • DataContract le permite especificar un orden específico de los elementos de datos - XmlSerializer es sólo con el orden en el que aparecen en el código fuente

  • XmlSerializer requiere un público, sin parámetros constructor para la clase

en ejemplos sencillos, estas ventajas de DataContractSerializer podría no parecer mucho, de verdad - pero puede ser una clara ventaja en aplicaciones de mayor escala si su objeto de datos hacer no tiene que tener un constructor público sin parámetros, y que no es necesario que los elementos de la superficie "artificialmente" como propiedades públicas solo para incluirlos en la serialización.

Marc

2

Punto de clarificación: La [Serializable] atributo tiene nada que ver con XmlSerialization. El atributo [Serializable] tiene que ver con Runtime.Serialization. Confuso, sí.

Hay demasiados serializadores en .NET.

Cuestiones relacionadas