Partager via


Introduction à la sérialisation XML

La sérialisation est le processus de conversion d'un objet en un formulaire qui peut être transporté facilement. Par exemple, vous pouvez sérialiser un objet et le transporter sur Internet entre un client et un serveur à l'aide du protocole HTTP. À l'autre extrémité, la désérialisation reconstruit l'objet à partir du flux.

La sérialisation XML ne sérialise que les champs publics et les valeurs des propriétés d'un objet dans un flux XML. La sérialisation n'inclut pas d'informations de type. Par exemple, si vous avez un objet Book qui existe dans un espace de noms Library, rien ne garantit qu'il sera désérialisé dans un objet du même type.

Notes

La sérialisation XML ne convertit pas de méthodes, d'indexeurs, de champs privés ou de propriétés en lecture seule (sauf les collections en lecture seule). Pour sérialiser tous les champs et toutes les propriétés d'un objet, privés et publics, utilisez BinaryFormatter au lieu de la sérialisation XML.

La classe centrale de la sérialisation XML est la classe XmlSerializer et ses méthodes les plus importantes sont les méthodes Serialize et Deserialize. XmlSerializer crée des fichiers C# et les compile en fichiers .dll pour exécuter cette sérialisation. Dans .NET Framework 2.0, l'outil XML Serializer Generator Tool (Sgen.exe) est conçu pour générer ces assemblys de sérialisation avant de les déployer avec votre application et améliorer ainsi les performances de démarrage. Le flux XML généré par la classe XmlSerializer est conforme à la recommandation du langage XSD (XML Schema Definition) 1.0 du World Wide Web Consortium disponible à l'adresse suivante : www.w3.org. De plus, les types de données générés sont conformes au document intitulé "XML Schema Part 2: Datatypes".

Les données dans vos objets sont décrites à l'aide de constructions de langage de programmation comme les classes, les champs, les propriétés, les types primitifs, les tableaux, voire du code XML incorporé sous la forme d'objets XmlElement ou XmlAttribute. Vous avez l'option de créer vos propres classes annotées avec des attributs ou d'utiliser l'outil XML Schema Definition pour générer les classes basées sur un schéma XML existant.

Si vous avez un schéma XML, vous pouvez exécuter l'outil XML Schema Definition pour produire un ensemble de classes fortement typées au schéma et annotées avec des attributs. Lorsqu'une instance d'une telle classe est sérialisée, le code XML généré se conforme au schéma XML. À l'aide de cette classe, vous pouvez programmer en vous servant d'un modèle objet facilement manipulé tout en étant certain que le code XML généré se conforme au schéma XML. Cette solution remplace l'utilisation d'autres classes dans .NET Framework, telles que les classes XmlReader et XmlWriter, pour analyser et écrire un flux XML. Pour plus d'informations, voir Documents et données XML. Ces classes vous permettent d'analyser n'importe quel flux XML. Par contre, utilisez la classe XmlSerializer lorsque le flux XML est censé respecter un schéma XML connu.

Les attributs contrôlent le flux XML généré par la classe XmlSerializer, ce qui vous permet de définir l'espace de noms XML, le nom de l'élément, le nom de l'attribut, etc. du flux XML. Pour plus d'informations sur ces attributs et sur la manière dont ils contrôlent la sérialisation XML, voir Contrôle de la sérialisation XML à l'aide d'attributs. Pour obtenir un tableau des attributs utilisés pour le contrôle de code XML généré, voir Attributs qui contrôlent la sérialisation XML.

La classe XmlSerializer peut sérialiser un objet à un niveau supérieur et générer un flux XML codé au format SOAP. Le code XML généré se conforme à la section 5 du document du World Wide Web Consortium intitulé "Simple Object Access Protocol (SOAP) 1.1". Pour plus d'informations sur ce processus, voir Comment : Sérialiser un objet en tant que flux XML codé en SOAP. Pour obtenir un tableau des attributs qui contrôlent le code XML généré, voir Attributs qui contrôlent la sérialisation codée en SOAP.

La classe XmlSerializer génère les messages SOAP créés par les services Web XML et passés à ceux-ci. Pour contrôler les messages SOAP, vous pouvez appliquer des attributs aux classes, aux valeurs de retour, aux paramètres et aux champs qui figurent dans un fichier de service Web XML (.asmx). Vous pouvez utiliser les attributs répertoriés dans "Attributs qui contrôlent la sérialisation XML" et "Attributs qui contrôlent la sérialisation codée en SOAP" car un service Web XML peut utiliser soit le style codé en SOAP, soit le style littéral. Pour plus d'informations sur l'utilisation d'attributs pour contrôler le code XML généré par un service Web XML, voir Sérialisation XML à l'aide des services Web XML. Pour plus d'informations sur les services Web XML et SOAP, voir Personnalisation de la mise en forme des messages SOAP.

Considérations relatives à la sécurité des applications XmlSerializer

Lors de la création d'une application qui utilise XmlSerializer, vous devez prendre en compte les éléments suivants et leurs implications :

  • XmlSerializer crée des fichiers C# (.cs ) et les compile en fichiers .dll dans le répertoire nommé par la variable d'environnement TEMP ; la sérialisation a lieu avec ces DLL.

    Notes

    Ces assemblys de sérialisation peuvent être générés à l'avance et signés à l'aide de l'outil SGen.exe. Cela ne fonctionne pas pour le côté serveur des services Web. Cela s'applique uniquement au côté client et pour une sérialisation manuelle.

    Le code et les DLL sont vulnérables face à un processus nuisible lors de la création et de la compilation. Lors de l'utilisation d'un ordinateur qui exécute Microsoft Windows NT 4.0 ou une version ultérieure, il est parfois possible que deux utilisateurs partagent le répertoire temporaire. Le partage d'un répertoire temporaire présente des risques si les deux comptes ont des privilèges de sécurité différents et que le compte possédant des privilèges plus élevés exécute une application à l'aide de XmlSerializer. Dans ce cas, un utilisateur peut enfreindre la sécurité de l'ordinateur en remplaçant le fichier .cs ou .dll qui est compilé. Pour éliminer ce problème, veillez toujours à ce que chaque compte sur l'ordinateur possède son propre profil. Par défaut, la variable d'environnement TEMP pointe vers un répertoire différent pour chaque compte.

  • Si un utilisateur malveillant envoie un flux continu de données XML vers un serveur Web (attaque par déni de service), XmlSerializer continue de traiter les données jusqu'à ce que l'ordinateur manque de ressources.

    Ce type d'attaque est éliminé si vous utilisez un ordinateur qui exécute les services IIS (Internet Information Services) et que votre application s'exécute dans IIS. IIS comporte une porte qui ne traite pas les flux dont la taille est supérieure à une taille déterminée (4 Ko par défaut). Si vous créez une application qui n'utilise pas IIS et qui désérialise à l'aide de XmlSerializer, vous devez implémenter une porte similaire qui empêche toute attaque par déni de service.

  • XmlSerializer sérialise les données et exécute tout code à l'aide du type qui lui est attribué, quel que soit ce type.

    Un objet nuisible présente une menace sous deux formes. Il peut exécuter ou injecter du code malveillant dans le fichier C# créé par XmlSerializer. Dans le premier cas, si un objet nuisible essaye d'exécuter une procédure destructrice, la sécurité d'accès du code permet d'empêcher tout dommage. Dans le second cas, il existe une possibilité théorique qu'un objet nuisible parvienne d'une manière ou d'une autre à injecter du code dans le fichier C# créé par XmlSerializer. Bien que ce problème ait fait l'objet d'une attention rigoureuse et que ce type d'attaque soit improbable, vous devez prendre la précaution de ne jamais sérialiser des données à l'aide d'un type inconnu et qui n'est pas digne de confiance.

  • Les données sensibles sérialisées peuvent être vulnérables.

    Après la sérialisation des données par XmlSerializer, elles peuvent être stockées en tant que fichier XML ou dans un autre magasin de données. Si votre magasin de données est disponible à d'autres processus ou s'il est visible sur un intranet ou Internet, les données peuvent être volées et utilisées à des fins malveillantes. Par exemple, si vous créez une application qui sérialise des commandes contenant des numéros de carte de crédit, les données sont particulièrement sensibles. Pour éviter cela, protégez toujours votre magasin de données et faites en sorte de préserver la confidentialité de vos données.

Sérialisation d'une classe simple

Le code suivant montre une classe simple avec un champ public.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Lorsqu'une instance de cette classe est sérialisée, elle peut ressembler à ce qui suit.

<OrderForm>
    <OrderDate>12/12/01</OrderDate>
</OrderForm>

Pour obtenir d'autres exemples de sérialisation, voir Exemples de sérialisation XML.

Éléments pouvant être sérialisés

Les éléments suivants peuvent être sérialisés à l'aide de la classe XmLSerializer :

  • Propriétés en lecture/écriture publiques et champs de classes publiques

  • Classes implémentant ICollection ou IEnumerable

    Notes

    Seules les collections sont sérialisées, pas les propriétés publiques.

  • Objets XmlElement

  • Objets XmlNode

  • Objets DataSet

Pour plus d'informations sur la sérialisation et la désérialisation des objets, voir Comment : Sérialiser un objet et Comment : Désérialiser un objet.

Avantages de la sérialisation XML

La classe XmlSerializer vous donne un contrôle complet et souple lorsque vous sérialisez un objet au format XML. Si vous créez un service Web XML, vous pouvez appliquer les attributs qui contrôlent la sérialisation aux classes et aux membres pour garantir que la sortie XML se conforme à un schéma spécifique.

Par exemple, la classe XmlSerializer vous permet d'effectuer les opérations suivantes :

  • Spécifier si un champ ou une propriété doit être codée en tant qu'attribut ou élément.

  • Spécifier un espace de noms XML à utiliser.

  • Spécifier le nom d'un élément ou d'un attribut si un nom de champ ou de propriété ne convient pas.

Un autre avantage de la sérialisation XML est l'absence de contrainte sur les applications que vous développez tant que le flux XML qui est généré se conforme à un schéma donné. Imaginez un schéma utilisé pour décrire des livres. Il comporte un élément titre, auteur, éditeur et numéro ISBN. Vous pouvez développer une application qui traite les données XML de la façon dont vous voulez, par exemple sous forme de commande de livres ou d'inventaire de livres. Dans l'un ou l'autre cas, la seule exigence est celle de la conformité du flux XML au schéma XSD (XML Schema Definition) spécifié.

Considérations relatives à la sérialisation XML

Les éléments suivants doivent être pris en compte lors de l'utilisation de la classe XmlSerializer :

  • L'outil Sgen.exe est conçu expressément pour générer des assemblys de sérialisation à des fins de performances optimales.

  • Les données sérialisées contiennent uniquement les données elles-mêmes et la structure de vos classes. Les informations d'assembly et d'identité de type ne sont pas incluses.

  • Seuls les champs et propriétés publics peuvent être sérialisés. S'il vous faut sérialiser des données non publiques, utilisez la classe BinaryFormatter plutôt que la sérialisation XML.

  • Une classe doit posséder un constructeur par défaut pour être sérialisée par XmlSerializer.

  • Les méthodes ne peuvent pas être sérialisées.

  • XmlSerializer peut traiter les classes qui implémentent IEnumerable ou ICollection différemment si celles-ci répondent à certains critères, indiqués ci-dessous.

    Une classe qui implémente IEnumerable doit implémenter une méthode Add publique qui prend un seul paramètre. Le paramètre de la méthode Add doit être cohérent (polymorphe) avec le type retourné à partir de la propriété IEnumerator.Current retournée à partir de la méthode GetEnumerator.

    Une classe qui implémente ICollection en plus de IEnumerable (telle que CollectionBase) doit avoir une propriété indexée Item publique (un indexeur dans C#) qui prend un entier, ainsi qu'une propriété Count publique de type integer. Le paramètre passé à la méthode Add doit être du même type que celui retourné à partir de la propriété Item ou l'une des bases de ce type.

    Pour les classes qui implémentent ICollection, les valeurs à sérialiser sont extraites à partir de la propriété Item indexée plutôt qu'en appelant GetEnumerator. Par ailleurs, les champs et propriétés publics ne sont pas sérialisés à l'exception des champs publics qui retournent une autre classe de collection (une classe implémentant ICollection). Pour obtenir un exemple, voir Exemples de sérialisation XML.

Mappage de types de données XSD

Le document World Wide Web Consortium (www.w3.org) intitulé "XML Schema Part 2: Datatypes" spécifie les types de données simples qui sont autorisés dans un schéma XSD (XML Schema Definition). Pour la plupart de ces types (par exemple, int et decimal), il existe un type de données correspondant dans .NET Framework. Cependant, certains types de données XML ne possèdent pas de type de données correspondant dans .NET Framework (le type de données NMTOKEN par exemple). Dans de tels cas, si vous utilisez l'outil XML Schema Definition (XML Schema Definition Tool (Xsd.exe)) pour générer des classes à partir d'un schéma, un attribut approprié est appliqué à un membre de type string. Sa propriété DataType prend la valeur du nom du type de données XML. Par exemple, si un schéma contient un élément nommé "MyToken" avec le type de données XML NMTOKEN, la classe générée peut contenir un membre, comme le montre l'exemple suivant.

<XmlElement(DataType:="NMTOKEN")> _
Public MyToken As String
[XmlElement(DataType = "NMTOKEN")]
public string MyToken;

De même, si vous créez une classe qui doit respecter un schéma XSD (XML Schema Definition), vous devez appliquer l'attribut approprié et attribuer à sa propriété DataType le nom de type de données XML souhaité.

Pour obtenir la liste complète des correspondances de types, voir la propriété DataType de l'une des classes d'attributs suivantes :

Voir aussi

Tâches

Comment : Sérialiser un objet
Comment : Désérialiser un objet

Référence

XMLSerializer.Serialize
BinaryFormatter
XmlSerializer
FileStream

Concepts

Exemples de sérialisation XML

Autres ressources

Sérialisation XML et SOAP
Sérialisation binaire
Sérialisation