¿Cuándo usar los atributos DataContract y DataMember?

179

Estoy muy confundido sobre el DataContractatributo en WCF. Según mi conocimiento, se usa para serializar tipos definidos por el usuario como clases. Escribí una clase que está expuesta en el lado del cliente de esta manera.

[DataContract]
public class Contact
{
    [DataMember]
    public int Roll { get; set; }

    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Address { get; set; }

    [DataMember]
    public int Age { get; set; }
}

Está funcionando correctamente pero cuando lo elimino DataContracty DataMembertambién funciona correctamente. No puedo entender por qué funciona correctamente. ¿Alguien puede decirme cuál es el uso real DataContract?

Mi contrato de servicio se ve así

[ServiceContract]    
public interface IRestServiceImpl
{
    [OperationContract]        
    Contact XmlData(string id);      
}
sam
fuente
Una respuesta perfecta está aquí stackoverflow.com/questions/5681842/…
Asif Iqbal

Respuestas:

361

Dado que muchos programadores estaban abrumados con los atributos [DataContract]y [DataMember], con .NET 3.5 SP1, Microsoft hizo que el serializador de contrato de datos manejara todas las clases, incluso sin ninguno de esos atributos, al igual que el antiguo serializador XML.

Entonces, a partir de .NET 3.5 SP1, ya no tiene que agregar el contrato de datos o los atributos del miembro de datos; si no lo hace, el serializador de contrato de datos serializará todas las propiedades públicas en su clase, tal como lo haría el serializador XML.

SIN EMBARGO: al no agregar esos atributos, pierde muchas capacidades útiles:

  • sin [DataContract], no puede definir un espacio de nombres XML para que sus datos vivan
  • sin [DataMember], no puede serializar propiedades o campos no públicos
  • sin [DataMember], no puede definir un orden de serialización ( Order=) y el DCS serializará todas las propiedades alfabéticamente
  • sin [DataMember], no puede definir un nombre diferente para su propiedad ( Name=)
  • sin [DataMember], no puedes definir cosas como IsRequired=u otros atributos útiles
  • sin [DataMember], no puede omitir ciertas propiedades públicas: todas las propiedades públicas serán serializadas por DCS

Así que para una solución "quick'n'dirty", dejando la distancia [DataContract]y [DataMember]atributos trabajará - pero aún así es una buena idea contar con ellos en sus clases de datos - sólo para ser más explícitos acerca de lo que está haciendo, y para que tenga acceso a todas esas funciones adicionales que no obtienes sin ellas ...

marc_s
fuente
quiere decir que, de manera predeterminada, todos los tipos de datos están marcados internamente como serializables y utilizamos DataContract / DataMember para restringirlos.
santosh singh
2
@Santosh: si tiene una clase con algunas propiedades públicas, éstas serán serializadas por el serializador de contrato de datos de WCF, a menos que aplique explícitamente [DataContract] / [DataMember] .- entonces depende 100% de usted decir qué se serializa y qué no
marc_s
36
@ Arthur: eso no es del todo cierto. A partir de .NET 3.5 SP1, WCF felizmente serializará clases sin ninguno [DataContract] y [DataMember]atributos ... pero tan pronto como comience a usar uno de esos atributos, este comportamiento "predeterminado" dejará de funcionar, tan pronto como tenga uno [DataMember] en su A partir de ese momento, solo se serializarán las propiedades con este atributo.
marc_s
44
Oohh! Gracias por aclarar ese punto! ¡Lo cavaré un poco más entonces!
Arthis
66
Youhou! se mece !! ¡Muchas gracias!
Arthis
16

En términos de WCF, podemos comunicarnos con el servidor y el cliente a través de mensajes. Para transferir mensajes, y desde una perspectiva de seguridad, necesitamos hacer un dato / mensaje en un formato serializado.

Para serializar datos usamos los atributos [datacontract] y [datamember]. En su caso, si está usando datacontractWCF, usa DataContractSerializerWCF, XmlSerializerque es la técnica de serialización predeterminada.

Déjame explicarte en detalle:

básicamente WCF admite 3 tipos de serialización:

  1. XmlSerializer
  2. DataContractSerializer
  3. NetDataContractSerializer

XmlSerializer : - El orden predeterminado es el mismo que la clase

DataContractSerializer / NetDataContractSerializer : - El orden predeterminado es alfabético

XmlSerializer : - El esquema XML es extenso

DataContractSerializer / NetDataContractSerializer : - El esquema XML está restringido

XmlSerializer : - No es posible el soporte de versiones

DataContractSerializer / NetDataContractSerializer : - Es posible el soporte de versiones

XmlSerializer : - Compatibilidad con ASMX

DataContractSerializer / NetDataContractSerializer : - Compatibilidad con .NET Remoting

XmlSerializer : - Atributo no requerido en XmlSerializer

DataContractSerializer / NetDataContractSerializer : - Atributo requerido en esta serialización

entonces, lo que usa depende de sus requisitos ...

Pradeep atkari
fuente
8

Un contrato de datos es un acuerdo formal entre un servicio y un cliente que describe de manera abstracta los datos que se intercambian. Es decir, para comunicarse, el cliente y el servicio no tienen que compartir los mismos tipos, solo los mismos contratos de datos. Un contrato de datos define con precisión, para cada parámetro o tipo de retorno, qué datos se serializan (se convierten en XML) para intercambiar.

Windows Communication Foundation (WCF) usa un motor de serialización llamado serializador de contrato de datos de forma predeterminada para serializar y deserializar datos (convertirlos hacia y desde XML). Todos los tipos primitivos de .NET Framework, como enteros y cadenas, así como ciertos tipos tratados como primitivos, como DateTime y XmlElement, se pueden serializar sin otra preparación y se considera que tienen contratos de datos predeterminados. Muchos tipos de .NET Framework también tienen contratos de datos existentes.

Puedes encontrar el artículo completo aquí.

mr.b
fuente
2
Todo eso es cierto, y muy bien, pero en realidad no contesta la pregunta de la OP de por qué el serializador contrato de datos también funciona sin ningún tipo de [DataContract] y [DataMember] atribuye en sus clases ....
marc_s
¿Alguien puede decirme cuál es el uso real de DataContract? - Creo que al menos parte de la pregunta está respondida.
Resumen de
2

Un contrato de datos es un acuerdo formal entre un servicio y un cliente que describe de manera abstracta los datos que se intercambian.

El contrato de datos puede ser explícito o implícito. El tipo simple como int, string, etc. tiene un contrato de datos implícito. Los objetos definidos por el usuario son de tipo explícito o complejo, para lo cual debe definir un contrato de datos utilizando los atributos [DataContract] y [DataMember].

Un contrato de datos se puede definir de la siguiente manera:

  • Describe el formato externo de los datos pasados ​​ay desde las operaciones de servicio.

  • Define la estructura y los tipos de datos intercambiados en los mensajes de servicio.

  • Asigna un tipo CLR a un esquema XML
  • Define cómo se serializan y deserializan los tipos de datos. A través de la serialización, convierte un objeto en una secuencia de bytes que se pueden transmitir a través de una red. A través de la deserialización, vuelve a ensamblar un objeto de una secuencia de bytes que recibe de una aplicación de llamada.
  • Es un sistema de versiones que le permite administrar los cambios en los datos estructurados.

Necesitamos incluir la referencia de System.Runtime.Serialization al proyecto. Este ensamblado contiene el atributo DataContract y DataMember.

Kamran
fuente
2
  1. Contrato de datos: especifica que su clase de entidad está lista para el proceso de serialización.

  2. Miembros de datos: especifica que el campo particular es parte del contrato de datos y se puede serializar.

Mrunalini
fuente
0

Además, cuando llame desde una solicitud http, funcionará correctamente, pero cuando intente llamar desde net.tcp en ese momento obtendrá todo este tipo de cosas

Pramod
fuente
0

El atributo DataMember no es obligatorio agregar para serializar datos. Cuando no se agrega el atributo DataMember, el antiguo XMLSerializer serializa los datos. Agregar un DataMember proporciona propiedades útiles como orden, nombre, se requiere que no se puede usar de otra manera.

Vijay Mishra
fuente