wcf - studio - Cuándo usar los atributos DataContract y DataMember?
operationcontract (7)
Contrato de datos: especifica que su clase de entidad está lista para el proceso de serialización.
Miembros de datos: especifica que el campo particular es parte del contrato de datos y se puede serializar.
Estoy muy confundido sobre el atributo DataContract
en WCF. Según mi conocimiento, se usa para serializar tipo de usuario definido 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 DataMember
DataContract
y DataMember
también funciona correctamente. No puedo entender por qué está funcionando correctamente. ¿Alguien puede decirme cuál es el uso real de DataContract
?
Mi contrato de servicio se ve así
[ServiceContract]
public interface IRestServiceImpl
{
[OperationContract]
Contact XmlData(string id);
}
Debido a que muchos programadores estaban abrumados con los atributos [DataContract]
y [DataMember]
, con .NET 3.5 SP1, Microsoft hizo que el serializador de contratos de datos manejara todas las clases, incluso sin ninguno de esos atributos, al igual que el antiguo serializador XML.
A partir de .NET 3.5 SP1, ya no tiene que agregar atributos de contrato de datos o miembros de datos; si no lo hace, el serializador de contratos de datos serializará todas las propiedades públicas de su clase, al igual que el serializador XML.
SIN EMBARGO: al no agregar esos atributos, pierdes muchas capacidades útiles:
- sin
[DataContract]
, no puede definir un espacio de nombre XML para que vivan sus datos - 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 puede definir cosas comoIsRequired=
u otros atributos útiles - sin
[DataMember]
, no puede dejar de lado ciertas propiedades públicas: todas las propiedades públicas serán serializadas por DCS
Entonces, para una solución "quick''n''dirty", dejar de lado los atributos [DataContract]
y [DataMember]
funcionará, pero sigue siendo una buena idea tenerlos en sus clases de datos, solo para ser más explícito sobre lo que es haciendo, y para tener acceso a todas las características adicionales que no se obtienen sin ellas ...
El atributo DataMember no es obligatorio de agregar para serializar datos. Cuando el atributo DataMember no se agrega, el antiguo XMLSerializer serializa los datos. Agregar un DataMember proporciona propiedades útiles como order, name, isrequired que no se pueden usar de otro modo.
En términos de WCF, podemos comunicarnos con el servidor y el cliente a través de mensajes. Para la transferencia de 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 datacontract
WCF usa DataContractSerializer
, en cambio WCF utiliza XmlSerializer
que es la técnica de serialización predeterminada.
Déjame explicarte en detalle:
básicamente, WCF admite 3 tipos de serialización:
- XmlSerializer
- DataContractSerializer
- NetDataContractSerializer
XmlSerializer : el orden predeterminado es Igual que la clase
DataContractSerializer / NetDataContractSerializer : - El orden predeterminado es alfabético
XmlSerializer : - El esquema XML es extensivo
DataContractSerializer / NetDataContractSerializer : - El esquema XML está restringido
XmlSerializer : - No es posible el control de versiones
DataContractSerializer / NetDataContractSerializer : - Se admite el control 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 usas depende de tus requisitos ...
También cuando llamas desde http request, funcionará correctamente, pero cuando tratas de llamar desde net.tcp, esa vez obtienes todo este tipo de cosas
Un contrato de datos es un acuerdo formal entre un servicio y un cliente que describe de manera abstracta los datos que se intercambiarán. 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 (convertidos en XML) para ser intercambiados.
Windows Communication Foundation (WCF) utiliza un motor de serialización llamado Serializador de contrato de datos de forma predeterminada para serializar y deserializar datos (convertirlo a XML y desde XML). Todos los tipos primitivos .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 consideran como contratos de datos predeterminados. Muchos tipos de .NET Framework también tienen contratos de datos existentes.
Puedes encontrar el artículo completo here.
Un contrato de datos es un acuerdo formal entre un servicio y un cliente que describe de manera abstracta los datos que se intercambiarán.
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. El objeto definido por el usuario es explícito o tipo complejo, para lo cual debe definir un contrato de datos utilizando el atributo [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 del 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 puede transmitir a través de una red. Mediante la deserialización, vuelve a ensamblar un objeto a partir de una secuencia de bytes que recibe de una aplicación de llamada.
- Es un sistema de control de versiones que le permite administrar cambios a datos estructurados
Necesitamos incluir la referencia System.Runtime.Serialization al proyecto. Este ensamblaje contiene el atributo DataContract y DataMember.