Types pris en charge par le sérialiseur de contrat de données
Windows Communication Foundation (WCF) utilise DataContractSerializer comme moteur de sérialisation par défaut pour convertir des données en XML et reconvertir XML en données. DataContractSerializer est conçu pour sérialiser des types de contrat de données. Toutefois, il prend en charge de nombreux autres types qui peuvent être considérés comme ayant un contrat de données implicite. Voici une liste complète des types qui peuvent être sérialisés :
Tous les types visibles publiquement qui ont un constructeur sans paramètre.
Types de contrats de données. Ce sont les types auxquels l'attribut DataContractAttribute a été appliqué. Les nouveaux types personnalisés qui représentent des objets métier doivent normalement être créés en tant que types de contrat de données. Pour plus d'informations, consultez Utilisation de contrats de données et Types sérialisables.
Types collection. Ce sont des types qui représentent des listes de données. Il peut s'agir de tableaux normaux de types, ou de types collection, tels que ArrayList et Dictionary. L'attribut CollectionDataContractAttribute peut être utilisé pour personnaliser la sérialisation de ces types, mais n'est pas requis. Pour plus d'informations, consultez Types de collections dans les contrats de données.
Types énumération. Les énumérations, y compris les énumérations d'indicateur, sont sérialisables. Les types énumération peuvent, de manière facultative, être marqués avec l'attribut DataContractAttribute, auquel cas chaque membre participant à la sérialisation, doit être marqué avec l'attribut EnumMemberAttribute. Les membres qui ne sont pas marqués ne sont pas sérialisés. Pour plus d'informations, consultez Types énumération dans les contrats de données.
Types primitifs .NET Framework. Les types suivants construits dans le .NET Framework peuvent tous être sérialisés et sont considérés comme des types primitifs : Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Boolean, Char, Decimal, Object et String.
Autres types primitifs. Ces types ne sont pas primitifs dans le .NET Framework mais sont traités comme des types primitifs dans le format XML sérialisé. Ces types sont DateTime, DateTimeOffset, TimeSpan, Guid, Uri, XmlQualifiedName et les tableaux de Byte.
Remarque : Contrairement à d'autres types primitifs, DateTimeOffset n'est pas un type connu par défaut. Pour plus d'informations, consultez Types connus de contrats de données). Types marqués avec l'attribut SerializableAttribute. De nombreux types inclus dans la bibliothèque de la classe de base du .NET Framework font partie de cette catégorie. DataContractSerializer prend totalement en charge ce modèle de programmation de sérialisation, utilisé par .NET Framework Remoting, BinaryFormatter et SoapFormatter, incluant la prise en charge de l'interface ISerializable.
Types qui représentent un XML brut ou types qui représentent les données relationnelles de ADO.NET. XmlElement et le tableau des types XmlNode sont pris en charge en tant que solution de représentation directe de XML. En outre, les types qui implémentent l'interface IXmlSerializable sont pris en charge, y compris l'attribut XmlSchemaProviderAttribute connexe et les types XDocument et XElement. Le type DataTable et le type DataSet (ainsi que ses classes dérivées typées) de ADO.NET implémentent tous l'interface IXmlSerializable et font par conséquent partie de cette catégorie. Pour plus d'informations, consultez Types XML et ADO.NET dans les contrats de données.
Limitations d'utilisation de certains types en mode de confiance partielle
Voici une liste de limitations qui s'appliquent en cas d'utilisation de certains types dans les scénarios en mode de confiance partielle :
Pour sérialiser ou désérialiser un type qui implémente ISerializable dans un code d'un niveau de confiance partielle utilisant DataContractSerializer, les autorisations SerializationFormatter et UnmanagedCode sont nécessaires.
Lors de l'exécution du code WCF en mode Confiance partielle, la sérialisation et la désérialisation des champs readonly (à la fois public et private) ne sont pas prises en charge. C'est parce que l'IL généré est incontrôlable et par conséquent requiert des autorisations élevées.
DataContractSerializer et XmlSerializer sont pris en charge dans un environnement de confiance partielle. Toutefois, l'utilisation de DataContractSerializer est soumise aux conditions suivantes :
Tous les types [DataContract] sérialisables doivent être "public".
Tous les champs ou les propriétés [DataMember] sérialisables dans un type [DataContract] doivent être "public" et en lecture/écriture. La sérialisation et la désérialisation des champs en readonly ne sont pas prises en charge lors de l'exécution de WCF dans une application de confiance partielle.
Le modèle de programmation [Serializable]/ISerializable] n'est pas pris en charge dans un environnement de confiance partielle.
Les types connus doivent être spécifiés dans le code ou dans la configuration au niveau de l'ordinateur (Machine.config). Les types connus ne peuvent pas être spécifiés dans la configuration au niveau de l'application pour des raisons de sécurité.
Les types qui implémentent IObjectReference lèveront une exception dans un environnement de confiance partielle car la méthode GetRealObject requiert l'autorisation de sécurité [SecurityPermission(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.SerializationFormatter)].
Remarques supplémentaires sur la sérialisation
Les règles suivantes s'appliquent également aux types pris en charge par le sérialiseur de contrat de données :
Les types génériques sont pleinement pris en charge par le sérialiseur de contrat de données.
Les types Nullable sont pleinement pris en charge par le sérialiseur de contrat de données.
Les types d'interface sont traités comme Object ou, dans le cas d'interfaces de la collection, comme types collection.
À la fois les structures et les classes sont prises en charge.
DataContractSerializer ne prend pas en charge le modèle de programmation utilisé par les services Web XmlSerializer et ASP.NET. En particulier, il ne prend pas en charge d'attributs comme XmlElementAttribute et XmlAttributeAttribute. Pour activer la prise en charge pour ce modèle de programmation, WCF doit être basculé pour utiliser XmlSerializer au lieu de DataContractSerializer.
Le type DBNull est traité d'une façon spéciale. C'est un type singleton et, sur la désérialisation, le désérialiseur respecte la contrainte singleton et pointe toutes les références DBNull à l'instance singleton. Parce que DBNull est un type sérialisable, il demande l'autorisation SerializationFormatter.
Voir aussi
Concepts
Types XML et ADO.NET dans les contrats de données
Utilisation de contrats de données
Types sérialisables
Types de collections dans les contrats de données
Types énumération dans les contrats de données