Classe System.Runtime.Serialization.DataContractSerializer

Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.

Utilisez la classe DataContractSerializer pour sérialiser et désérialiser des instances d'un type dans un flux ou un document XML. Par exemple, vous pouvez créer un type nommé Person avec des propriétés qui contiennent des données essentielles, telles qu'un nom et une adresse. Vous pouvez créer ensuite et manipuler une instance de la classe Person et écrire toutes ses valeurs de propriété dans un document XML en vue de récupération ultérieure, ou dans un flux XML pour un transport immédiat. Plus important, il DataContractSerializer est utilisé pour sérialiser et désérialiser les données envoyées dans les messages Windows Communication Foundation (WCF). Appliquez l'attribut DataContractAttribute aux classes, et l'attribut DataMemberAttribute aux membres des classes pour spécifier les propriétés et les champs sérialisés.

Pour obtenir la liste des types qui peuvent être sérialisés, consultez Types pris en charge par le sérialiseur de contrat de données.

Pour utiliser la classe DataContractSerializer, créez d'abord une instance d'une classe et un objet apte à écrire ou lire le format ; par exemple, une instance de la classe XmlDictionaryWriter. Appelez ensuite la méthode WriteObject pour rendre les données persistantes. Pour récupérer des données, créez un objet apte à lire le format de données (par exemple, une classe XmlDictionaryReader pour un document XML) et appelez la méthode ReadObject.

Pour plus d’informations sur l’utilisation de l’élément DataContractSerializer, consultez Sérialisation et Désérialisation.

Vous pouvez définir le type d’un sérialiseur de contrat de données à l’aide de l’élément <dataContractSerializer> dans un fichier de configuration d’application cliente.

Préparer des classes pour la sérialisation ou la désérialisation

La classe DataContractSerializer est utilisée en association avec les DataContractAttribute et DataMemberAttribute. Pour préparer une classe à la sérialisation, appliquez DataContractAttribute à la classe. Pour chaque membre de la classe qui retourne des données que vous voulez sérialiser, appliquez DataMemberAttribute. Vous pouvez sérialiser des champs et des propriétés, quelle que soit l'accessibilité : privés, protégés, internes, internes protégés ou publics.

Par exemple, votre schéma spécifie un Customer avec une propriété ID, mais vous possédez déjà une application existante qui utilise un type nommé Person avec une propriété Name. Pour créer un type conforme au contrat, appliquez d'abord la classe DataContractAttribute à la classe. Appliquez ensuite la classe DataMemberAttribute à chaque champ ou propriété que vous souhaitez sérialiser.

Remarque

Vous pouvez appliquer la classe DataMemberAttribute aux membres privés et publics.

Le format final du code XML ne doit pas obligatoirement être le format texte. À la place, la classe DataContractSerializer écrit les données comme un jeu d'informations XML, qui vous permet d'écrire les données dans n'importe quel format reconnu par la classe XmlReader et XmlWriter. Il est recommandé d'utiliser les classes XmlDictionaryReader et XmlDictionaryWriter pour lire et écrire, car toutes deux sont optimisées pour l'utilisation de la classe DataContractSerializer.

Si vous créez une classe qui a des champs ou des propriétés qui doivent être renseignés avant la sérialisation ou la désérialisation, utilisez des attributs de rappel, comme décrit dans les rappels de sérialisation à tolérance de version.

Ajouter à la collection de types connus

Lors de la sérialisation ou désérialisation d'un objet, il est nécessaire que le type soit « connu » de la classe DataContractSerializer. Commencez en créant une instance d’une classe qui implémente IEnumerable<T> (comme List<T>) et en ajoutant les types connus à la collection. Créez ensuite une instance de l’utilisation DataContractSerializer de l’une des surcharges qui acceptent (IEnumerable<T>par exemple). DataContractSerializer(Type, IEnumerable<Type>)

Remarque

Contrairement aux autres types primitifs, la DateTimeOffset structure n’est pas un type connu par défaut. Elle doit donc être ajoutée manuellement à la liste des types connus (voir Types connus du contrat de données).

Compatibilité ascendante

La classe DataContractSerializer comprend les contrats de données conçus pour être compatibles avec de futures versions du contrat. Les types de cette sorte implémentent l'interface IExtensibleDataObject. L’interface présente la propriété ExtensionData qui retourne un objet ExtensionDataObject. Pour plus d’informations, consultez Contrats de données compatibles avec des versions ultérieures.

Exécuter sous approbation partielle

Lorsque vous instanciez l'objet cible pendant la désérialisation, la classe DataContractSerializer n'appelle pas le constructeur de l'objet cible. Si vous créez un type [DataContract] accessible à partir d’une approbation partielle (autrement dit, il est public et dans un assembly auquel l’attribut AllowPartiallyTrustedCallers est appliqué) et qui effectue certaines actions liées à la sécurité, vous devez savoir que le constructeur n’est pas appelé. En particulier, les techniques suivantes ne fonctionnent pas:

  • Si vous essayez de restreindre l’accès en confiance partielle en rendant le constructeur interne ou privé, ou en ajoutant un LinkDemand au constructeur, ni l’un ni l’autre n’ont d’effet pendant la désérialisation en confiance partielle.
  • Si vous codez la classe qui suppose que le constructeur a été exécuté, la classe peut se retrouver en état interne non valide qui est exploitable.