Clase System.Runtime.Serialization.DataContractAttribute

En este artículo se proporcionan comentarios adicionales a la documentación de referencia de esta API.

Aplique el atributo DataContractAttribute a los tipos (clases, estructuras o enumeraciones) que usa DataContractSerializer en serialización y operaciones de la deserialización Si envía o recibe mensajes mediante la infraestructura de Windows Communication Foundation (WCF), también debe aplicar a DataContractAttribute cualquier clase que contenga y manipule los datos enviados en los mensajes. Para obtener más información sobre los contratos de datos, consulte Utilización de contratos de datos.

También se debe aplicar DataMemberAttribute a cualquier campo, propiedad o evento que contenga los valores que desee serializar. Si se aplica DataContractAttribute, se permite explícitamente DataContractSerializer serializar y deserializar los datos.

Precaución

Puede aplicar DataMemberAttribute a campos privados. Tenga en cuenta que los datos devueltos por el campo (aun cuando es privado) se serializan y deserializan, de modo que un usuario o proceso malintencionado puede verlos o interceptarlos.

Para obtener más información sobre los contratos de datos, consulte los temas enumerados en Uso de contratos de datos.

Contratos de datos

Un contrato de datos es una descripción abstracta de un conjunto de campos con un nombre y un tipo de datos para cada campo. El contrato de datos existe fuera de cualquier implementación única para permitir la interoperación de servicios en plataformas diferentes. Siempre y cuando los datos que se pasen entre los servicios se ajusten al mismo contrato, todos los servicios podrán procesar los datos. Este procesamiento también se conoce como un sistema de acoplamiento flexible. Un contrato de datos también es similar a una interfaz en la que el contrato especifica cómo se deben entregar los datos para que los pueda procesar una aplicación. Por ejemplo, el contrato de datos puede llamar a un tipo de datos denominado "Persona" que tiene dos campos de texto, denominados "Nombre" y "Apellidos". Para crear un contrato de datos, aplique DataContractAttribute a la clase y aplique DataMemberAttribute a cualquier campo o propiedad que se deba serializar. Cuando esté serializado, los datos se ajustarán al contrato de datos que está integrado implícitamente en el tipo.

Nota:

Un contrato de datos difiere significativamente de una interfaz real en su comportamiento con las herencias. Las interfaces se heredan mediante cualquiera de los tipos derivados. Al aplicar DataContractAttribute a una clase base, los tipos derivados no heredan el atributo ni el comportamiento. Sin embargo, si un tipo derivado tiene un contrato de datos, se serializan los miembros de datos de la clase base. No obstante, debe aplicar DataMemberAttribute a los nuevos miembros en una clase derivada para que se puedan serializar.

Documentos de esquema XML y la herramienta SvcUtil

Si está intercambiando datos con otros servicios, debe describir el contrato de datos. Para la versión actual de DataContractSerializer, se puede usar un esquema XML para definir los contratos de datos. (Se pueden usar otras formas de metadatos/descripción para el mismo propósito). Para crear un esquema XML desde la aplicación, use la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) con la opción de línea de comandos /dconly . Cuando la entrada a la herramienta es un ensamblado, de forma predeterminada, la herramienta genera un conjunto de esquemas XML que define todos los tipos de contrato de datos situados en ese ensamblado. A la inversa, también puede usar la herramienta Svcutil.exe para crear definiciones de clase de Visual Basic o de C# que se ajusten a los requisitos de esquemas XML que usan estructuras que pueden expresarse mediante contratos de datos. En este caso, no se requiere la opción de línea de comandos /dconly .

Si la entrada a la herramienta Svcutil.exe es un esquema XML, de forma predeterminada, la herramienta crea un conjunto de clases. Si examina esas clases, observará que se ha aplicado DataContractAttribute. Puede usar esas clases para crear una nueva aplicación para procesar datos que se deben intercambiar con otros servicios.

También puede ejecutar la herramienta en un punto de conexión que devuelva un documento de Lenguaje de descripción de servicios web (WSDL) para generar automáticamente el código y la configuración para crear un cliente de Windows Communication Foundation (WCF). Los tipos de inclusiones de código generados que se marcan con DataContractAttribute.

Reutilización de tipos existentes

Un contrato de datos tiene dos requisitos básicos: un nombre estable y una lista de miembros. El nombre estable consta del identificador uniforme de recursos (URI) para el espacio de nombres y el nombre local del contrato. De forma predeterminada, cuando se aplica a DataContractAttribute una clase, se usa el nombre de clase como nombre local y el espacio de nombres de la clase (prefijo con "http://schemas.datacontract.org/2004/07/") como el URI del espacio de nombres. Los valores predeterminados se pueden invalidar estableciendo las propiedades Name y Namespace. También se puede cambiar el espacio de nombres aplicando ContractNamespaceAttribute al espacio de nombres. Use esta función cuando tenga un tipo existente que procese datos exactamente como los necesita pero que tienen un espacio de nombres y un nombre de clase diferentes a los del contrato de datos. Mediante la invalidación de los valores predeterminados, puede reutilizar el tipo existente y hacer que los datos serializados se ajusten al contrato de datos.

Nota:

En cualquier código, puede usar la palabra DataContract en lugar de la forma más larga DataContractAttribute.

Control de versiones

Un contrato de datos también puede alojar versiones posteriores de sí mismo. Es decir, cuando una versión posterior del contrato incluye datos adicionales, esos datos se almacenan y se devuelven a un remitente intactos. Para ello, implemente la interfaz IExtensibleDataObject.

Para obtener más información sobre el control de versiones, consulte Control de versiones del contrato de datos.