Compartir a través de


La clase System.Runtime.Serialization.DataContractSerializer

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

Use la DataContractSerializer clase para serializar y deserializar instancias de un tipo en un flujo o documento XML. Por ejemplo, puede crear un tipo denominado Person con propiedades que contengan datos esenciales, como un nombre y una dirección. A continuación, puede crear y manipular una instancia de la Person clase y escribir todos sus valores de propiedad en un documento XML para su recuperación posterior o en un flujo XML para el transporte inmediato. Lo más importante, el DataContractSerializer se utiliza para serializar y deserializar los datos enviados en mensajes de Windows Communication Foundation (WCF). Aplique el DataContractAttribute atributo a las clases y el DataMemberAttribute atributo 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 usar el DataContractSerializer, primero cree 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 WriteObject método para conservar los datos. Para recuperar datos, cree un objeto adecuado para leer el formato de datos (como un XmlDictionaryReader para un documento XML) y llamar al ReadObject método .

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 serialización o deserialización

DataContractSerializer se usa en combinación con las DataContractAttribute clases 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 el DataMemberAttribute. Puede serializar campos y propiedades sin tener en cuenta la accesibilidad: privado, protegido, interno, interno protegido o público.

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

Nota:

Puede aplicar el DataMemberAttribute tanto a los miembros privados como a los públicos.

No es necesario que el formato final del XML sea texto. En su lugar, DataContractSerializer escribe los datos como un conjunto de información XML, que permite escribir los datos en cualquier formato reconocido por y XmlReaderXmlWriter. Se recomienda usar las XmlDictionaryReader clases y XmlDictionaryWriter para leer y escribir, ya que 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 llamadas en la serialización tolerante a versiones.

Agregar a la colección de tipos conocidos

Al serializar o deserializar un objeto, es necesario que el tipo sea "conocido" para .DataContractSerializer Empiece por crear una instancia de una clase que implemente IEnumerable<T> (como List<T>) y agregue 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

El DataContractSerializer comprende los contratos de datos diseñados para ser compatibles con futuras versiones de esos contratos. Estos tipos implementan la IExtensibleDataObject interfaz . La interfaz presenta la ExtensionData propiedad que devuelve un ExtensionDataObject objeto . Para obtener más información, consulte Forward-Compatible Contratos de datos.

Ejecutar bajo confianza parcial

Al crear una instancia 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 concreto, 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 se pueda aprovechar.