Types pris en charge par le sérialiseur de contrat de données
Windows Communication Foundation (WCF) utilise la classe DataContractSerializer comme moteur de sérialisation par défaut pour convertir les données en XML et pour convertir du CODE 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 des 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<TKey,TValue>. 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 d’énumérations 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, Objectet 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, XmlQualifiedNameet les tableaux de Byte.
Notes
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, BinaryFormatteret 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 d’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 . L'attribut ADO.NETDataTable et le type DataSet (ainsi que ses classes dérivées typées) 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 Partial Trust, la sérialisation et la désérialisation des champs
readonly
(à la foispublic
etprivate
) 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.Le DataContractSerializer et le XmlSerializer sont pris en charge dans un environnement de confiance partielle. Toutefois, l'utilisation du 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 enreadonly
ne sont pas prises en charge lors de l’exécution de WCF dans une application de confiance partielle.L'attribut
[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 de valeurs 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 XmlSerializer et ASP.NET Web. 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 queDBNull
est un type sérialisable, il demande l'autorisation SerializationFormatter .