Clase System.Runtime.Serialization.DataContractSerializer

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

Utilice la clase DataContractSerializer para serializar y deserializar instancias de un tipo en un flujo o en un documento XML. Por ejemplo, puede crear un tipo denominado Person con propiedades que contienen datos esenciales, como un nombre y una dirección. A continuación puede crear y manipular una instancia de la clase Person y escribir todos sus valores de propiedad en un documento XML para recuperarlo posteriormente o en una secuencia XML para su transporte inmediato. Lo más importante es DataContractSerializer que se usa para serializar y deserializar los datos enviados en mensajes de Windows Communication Foundation (WCF). Aplique el atributo DataContractAttribute a las clases y el atributo DataMemberAttribute a los miembros de clase para especificar las propiedades y los campos que se serializan.

Para obtener una lista de tipos que se pueden serializar, vea Tipos admitidos por el serializador de contrato de datos.

Para utilizar DataContractSerializer, cree primero una instancia de una clase y un objeto adecuado para escribir o leer el formato; por ejemplo, una instancia de XmlDictionaryWriter. A continuación, llame al método WriteObject para conservar los datos. Para recuperar los datos, cree un objeto adecuado para leer el formato de datos (como un XmlDictionaryReader para un documento XML) y llame al método ReadObject.

Para obtener más información sobre el uso de DataContractSerializer, vea Serialización y deserialización.

Puede establecer el tipo de serializador de contrato de datos mediante el <elemento dataContractSerializer> en un archivo de configuración de la aplicación cliente.

Preparación de clases para la serialización o deserialización

DataContractSerializer se utiliza en combinación con las clases DataContractAttribute y DataMemberAttribute. Para preparar una clase para la serialización, aplique DataContractAttribute a la clase. Para cada miembro de la clase que devuelve datos que desea serializar, aplique DataMemberAttribute. Puede serializar campos y propiedades sin tener en cuenta la accesibilidad: privado, protegido, interno, interno protegido o público.

Por ejemplo, su esquema especifica un Customer con una propiedad ID, pero ya tiene una aplicación existente que utiliza un tipo denominado Person con una propiedad Name. Para crear un tipo que cumple el contrato, primero aplique DataContractAttribute a la clase. A continuación, aplique DataMemberAttribute a cada campo o propiedad que desea serializar.

Nota:

Puede aplicar DataMemberAttribute a los miembros privados y públicos.

El formato final del XML no tiene por qué ser texto. Al contrario, DataContractSerializer escribe los datos como conjunto de información de XML, lo que le permite escribir los datos en cualquier formato reconocido por XmlReader y XmlWriter. Se recomienda que utilice las clases XmlDictionaryReader y XmlDictionaryWriter para leer y escribir porque ambas están optimizadas para trabajar con DataContractSerializer.

Si va a crear una clase que tenga campos o propiedades que se deben rellenar antes de que se produzca la serialización o deserialización, use atributos de devolución de llamada, como se describe en Devoluciones de llamada de serialización tolerantes a versiones.

Agregar a la colección de tipos conocidos

Cuando se serializa o deserializa un objeto, se requiere que el tipo sea "conocido" por DataContractSerializer. Comience creando una instancia de una clase que implemente IEnumerable<T> (como List<T>) y agregando los tipos conocidos a la colección. A continuación, cree una instancia de DataContractSerializer mediante una de las sobrecargas que toma IEnumerable<T> (por ejemplo, DataContractSerializer(Type, IEnumerable<Type>)).

Nota:

A diferencia de otros tipos primitivos, la DateTimeOffset estructura no es un tipo conocido de forma predeterminada, por lo que debe agregarse manualmente a la lista de tipos conocidos (vea Tipos conocidos del contrato de datos).

Compatibilidad con versiones posteriores

DataContractSerializer entiende contratos de datos que se han diseñado para ser compatibles con versiones futuras del contrato. Tales tipos implementan la interfaz IExtensibleDataObject. La interfaz contiene la propiedad ExtensionData que devuelve un objeto ExtensionDataObject. Para obtener más información, vea Forward-Compatible Data Contracts (Contratos de datos compatibles con el reenvío).

Ejecutar bajo confianza parcial

Al crear instancias del objeto de destino durante la deserialización, DataContractSerializer no llama al constructor del objeto de destino. Si crea un tipo [DataContract] al que se puede acceder desde la confianza parcial (es decir, es público y en un ensamblado que tiene aplicado el AllowPartiallyTrustedCallers atributo) y que realiza algunas acciones relacionadas con la seguridad, debe tener en cuenta que no se llama al constructor. En particular, las técnicas siguientes no funcionan:

  • Durante la deserialización bajo confianza parcial, intentar restringir el acceso de confianza parcial haciendo el constructor interno o privado o agregando LinkDemand al constructor no tendrá ningún efecto.
  • Si codifica la clase que supone que el constructor se ha ejecutado, la clase puede entrar en un estado interno no válido que es explotable.