Estoy muy confundido sobre el DataContract
atributo 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 DataContract
y DataMember
tambié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);
}
Respuestas:
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:
[DataContract]
, no puede definir un espacio de nombres XML para que sus datos vivan[DataMember]
, no puede serializar propiedades o campos no públicos[DataMember]
, no puede definir un orden de serialización (Order=
) y el DCS serializará todas las propiedades alfabéticamente[DataMember]
, no puede definir un nombre diferente para su propiedad (Name=
)[DataMember]
, no puedes definir cosas comoIsRequired=
u otros atributos útiles[DataMember]
, no puede omitir ciertas propiedades públicas: todas las propiedades públicas serán serializadas por DCSAsí 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 ...fuente
[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.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
datacontract
WCF, usaDataContractSerializer
WCF,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 : - 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 ...
fuente
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í.
fuente
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.
Necesitamos incluir la referencia de System.Runtime.Serialization al proyecto. Este ensamblado contiene el atributo DataContract y DataMember.
fuente
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.
fuente
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
fuente
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.
fuente