Partager via


Utilisation de la classe XmlSerializer

Windows Communication Foundation (WCF) peut utiliser deux technologies de sérialisation différentes pour convertir les données de votre application en code XML transmis entre les clients et les services : processus appelé sérialisation.

DataContractSerializer comme classe par défaut

Par défaut, WCF utilise la classe DataContractSerializer pour sérialiser les types de données. Ce sérialiseur prend en charge les types suivants :

  • Types primitifs (par exemple, entiers, chaînes et tableaux d'octets), ainsi que quelques types spéciaux, tels que XmlElement et DateTime, traités comme des types primitifs.
  • Types de contrat de données (types marqués avec l'attribut DataContractAttribute).
  • Types marqués avec l'attribut SerializableAttribute, qui comprennent les types implémentant l'interface ISerializable.
  • Types qui implémentent l'interface IXmlSerializable.
  • Nombreux types de collections courants, notamment de nombreux types de collections génériques.

De nombreux types du .NET Framework appartiennent à ces deux dernières catégories et sont par conséquent sérialisables. Les tableaux de types sérialisables sont également sérialisables. Pour obtenir une liste complète, consultez Spécification du transfert de données dans des contrats de service.

Le DataContractSerializer, utilisé avec les types de contrats de données, est la méthode recommandée pour écrire de nouveaux services WCF. Pour plus d'informations, consultez Utilisation de contrats de données.

Quand utiliser la classe XmlSerializer ?

WCF prend également en charge la classe XmlSerializer. La classe XmlSerializer n'est pas exclusive à WCF. Il s'agit du même moteur de sérialisation utilisé par les services Web ASP.NET. La classe XmlSerializer prend en charge un ensemble de types beaucoup plus restreint que la classe DataContractSerializer, mais elle permet un meilleur contrôle sur le code XML résultant et prend en charge une plus grande partie de la norme XSD (XML Schema Definition). En outre, elle ne requiert aucun attribut déclaratif sur les types sérialisables. Pour plus d'informations, consultez la rubrique sur la sérialisation XML dans la documentation du .NET Framework. La classe XmlSerializer ne prend pas en charge les types de contrats de données.

Lors de l'utilisation de Svcutil.exe ou de la fonctionnalité Ajouter une référence de service dans Visual Studio en vue de générer du code client pour un service tiers ou d'accéder à un schéma tiers, un sérialiseur approprié est sélectionné automatiquement pour vous. Si le schéma est incompatible avec le DataContractSerializer, le XmlSerializer est sélectionné.

Basculement manuel vers le XmlSerializer

Il peut arriver parfois que vous deviez basculer manuellement vers le XmlSerializer. Cela peut arriver, par exemple, dans les cas suivants :

  • Lorsque vous effectuez une migration d'une application de services Web ASP.NET vers WCF, vous pouvez réutiliser des types existants compatibles avec XmlSerializer au lieu de créer de nouveaux types de contrats de données.
  • Lorsqu'il est important de contrôler de manière précise le code XML qui apparaît dans les messages, mais qu'aucun document WSDL (Web Services Description Language) n'est disponible, par exemple lors de la création d'un service avec des types qui doivent se conformer à un certain schéma publié standardisé qui n'est pas compatible avec le DataContractSerializer.
  • Lors de la création de services qui respectent la norme de codage SOAP héritée.

Dans les cas évoqués mais aussi dans d'autres cas, vous pouvez basculer manuellement vers la classe XmlSerializer en appliquant l'attribut XmlSerializerFormatAttribute à votre service, comme illustré dans le code suivant.

Considérations sur la sécurité

ms733901.note(fr-fr,VS.90).gifRemarque :
Il est important d'être prudent lorsque vous basculez d'un moteur de sérialisation à un autre. Le même type peut sérialiser en XML différemment selon le sérialiseur utilisé. Si vous utilisez par inadvertance le mauvais sérialiseur, vous risquez de divulguer des informations sur le type que vous ne souhaitiez pas divulguer.

Par exemple, la classe DataContractSerializer sérialise uniquement les membres marqués avec l'attribut DataMemberAttribute lors de la sérialisation de types de contrats de données. La classe XmlSerializer sérialise tout membre public. Examinez le type dans le code suivant.

Si le type est utilisé par inadvertance dans un contrat de service où la classe XmlSerializer est sélectionnée, le membre creditCardNumber est sérialisé, ce qui n'est sans doute pas voulu.

Bien que la classe DataContractSerializer soit la classe par défaut, vous pouvez la sélectionner explicitement pour votre service (bien que cela ne doive jamais être requis) en appliquant l'attribut DataContractFormatAttribute au type de contrat de service.

Le sérialiseur utilisé pour le service est une partie intégrante du contrat et ne peut pas être changé en sélectionnant une liaison différente ou en modifiant d'autres paramètres de configuration.

D'autres considérations importantes relatives à la sécurité s'appliquent à la classe XmlSerializer. En premier lieu, il est vivement recommandé que toute application WCF qui utilise la classe XmlSerializer soit signée avec une clé protégée de toute divulgation. Cette recommandation s'applique à la fois lorsqu'un basculement manuel vers le XmlSerializer est exécuté et lorsqu'un basculement automatique est exécuté (par Svcutil.exe, la fonctionnalité Ajouter une référence de service ou un outil semblable). Cela est dû au fait que le moteur de sérialisation XmlSerializer prend en charge le chargement d'assemblys de sérialisation prégénérés tant qu'ils sont signés avec la même clé que l'application. Une application non signée n'est pas du tout protégée contre le risque qu'un assembly nuisible correspondant au nom attendu de l'assembly de sérialisation prégénéré soit placé dans le dossier d'application ou le cache GAC (Global Assembly Cache). Bien entendu, un intrus doit tout d'abord accéder en écriture à l'un de ces deux emplacements pour tenter cette action.

Une autre menace qui existe lorsque vous utilisez XmlSerializer concerne l'accès en écriture au dossier système temporaire. Le moteur de sérialisation XmlSerializer crée et utilise des assemblys de sérialisation temporaires dans ce dossier. Vous devez savoir que tout processus ayant un accès en écriture au dossier temporaire peut remplacer ces assemblys de sérialisation par du code malveillant.

Règles pour la prise en charge de XmlSerializer

Vous ne pouvez pas appliquer directement des attributs compatibles avec XmlSerializer à des paramètres d'opération de contrat ou des valeurs de retour. Toutefois, ils peuvent être appliqués à des messages typés (parties du corps du contrat de message), comme illustré dans le code suivant.

En cas d'application à des membres de messages typés, ces attributs substituent les propriétés qui sont en conflit sur les attributs de messages typés. Par exemple, dans le code suivant, ElementName substitue Name.

L'attribut MessageHeaderArrayAttribute n'est pas pris en charge lors de l'utilisation du XmlSerializer.

ms733901.note(fr-fr,VS.90).gifRemarque :
Dans ce cas, XmlSerializer lève l'exception suivante, diffusée avant WCF : « Un élément déclaré au niveau supérieur d'un schéma ne peut pas avoir maxOccurs 1 >. Fournissez un élément wrapper pour « more » en utilisant XmlArray ou XmlArrayItem à la place de XmlElementAttribute ou en utilisant le style de paramètre Wrapped. »

Si vous recevez une telle exception, vérifiez si cette situation s'applique.

WCF ne prend pas en charge les attributs SoapIncludeAttribute et XmlIncludeAttribute dans les contrats de message et les contrats d'opérations ; utilisez plutôt l'attribut KnownTypeAttribute.

Voir aussi

Tâches

Comment : améliorer le temps de démarrage des applications clientes WCF à l'aide de XmlSerializer

Référence

DataContractFormatAttribute
DataContractSerializer
XmlSerializer
MessageHeaderArrayAttribute

Concepts

Spécification du transfert de données dans des contrats de service
Utilisation de contrats de données