Introduction à la sérialisation XMLIntroducing XML Serialization

La sérialisation correspond au processus de conversion d'un objet en un formulaire facilement transportable.Serialization is the process of converting an object into a form that can be readily transported. Par exemple, vous pouvez sérialiser un objet et le transporter par Internet via HTTP entre un client et un serveur.For example, you can serialize an object and transport it over the Internet using HTTP between a client and a server. À l'autre extrémité, la désérialisation reconstruit l'objet du flux de données.On the other end, deserialization reconstructs the object from the stream.

La sérialisation XML sérialise uniquement les champs publics et les valeurs de propriété d'un objet dans un flux de données XML.XML serialization serializes only the public fields and property values of an object into an XML stream. La sérialisation XML n'inclut pas d'informations de type.XML serialization does not include type information. Par exemple, si un objet Book se trouve dans l’espace de noms Library, il n’y a aucune garantie qu’il soit désérialisé dans un objet du même type.For example, if you have a Book object that exists in the Library namespace, there is no guarantee that it is deserialized into an object of the same type.

Notes

La sérialisation XML ne convertit pas les méthodes, les indexeurs, les champs privés ni les propriétés en lecture seule (à l'exception des collections en lecture seule).XML serialization does not convert methods, indexers, private fields, or read-only properties (except read-only collections). Pour sérialiser la totalité des champs et des propriétés d'un objet, publics et privés, utilisez DataContractSerializer au lieu de la sérialisation XML.To serialize all an object's fields and properties, both public and private, use the DataContractSerializer instead of XML serialization.

La classe centrale de la sérialisation XML est la classe XmlSerializer, et les méthodes les plus importantes de cette classe sont les méthodes Serialize et Deserialize.The central class in XML serialization is the XmlSerializer class, and the most important methods in this class are the Serialize and Deserialize methods. XmlSerializer crée des fichiers C# et les compile dans des fichiers .dll pour exécuter cette sérialisation.The XmlSerializer creates C# files and compiles them into .dll files to perform this serialization. Dans .NET Framework 2.0, l’outil XML Serializer Generator (Sgen.exe) est conçu pour générer préalablement les assemblys de sérialisation à déployer avec votre application et pour améliorer les performances de démarrage.In .NET Framework 2.0, the XML Serializer Generator Tool (Sgen.exe) is designed to generate these serialization assemblies in advance to be deployed with your application and improve startup performance. Le flux XML généré par le XmlSerializer est compatible avec le World Wide Web Consortium (W3C) langage de définition de schéma XML (XSD) 1.0 recommendation.The XML stream generated by the XmlSerializer is compliant with the World Wide Web Consortium (W3C) XML Schema definition language (XSD) 1.0 recommendation. En outre, les types de données générés sont conformes au document intitulé « XML Schema Part 2 : Les types de données. »Furthermore, the data types generated are compliant with the document titled "XML Schema Part 2: Datatypes."

Les données de vos objets sont décrites à l’aide des constructions du langage de programmation, telles que les classes, les champs, les propriétés, les types primitifs, les tableaux et même du code XML incorporé sous forme d’objets XmlElement ou XmlAttribute.The data in your objects is described using programming language constructs like classes, fields, properties, primitive types, arrays, and even embedded XML in the form of XmlElement or XmlAttribute objects. Vous pouvez créer vos propres classes, annotées avec des attributs ou utiliser l'outil XML Schema Definition pour générer des classes à partir d'un schéma XML existant.You have the option of creating your own classes, annotated with attributes, or using the XML Schema Definition tool to generate the classes based on an existing XML Schema.

Si vous disposez d'un schéma XML, vous pouvez exécuter l'outil XML Schema Definition pour générer un ensemble de classes fortement typées sur le schéma et annotées avec des attributs.If you have an XML Schema, you can run the XML Schema Definition tool to produce a set of classes that are strongly typed to the schema and annotated with attributes. Lorsqu'une instance d'une telle classe est sérialisée, le code XML généré respecte le schéma XML.When an instance of such a class is serialized, the generated XML adheres to the XML Schema. Lorsque vous disposez d'une telle classe, vous pouvez programmer à l'aide d'un modèle d'objet manipulé facilement tout en garantissant que le code XML généré se conforme au schéma XML.Provided with such a class, you can program against an easily manipulated object model while being assured that the generated XML conforms to the XML schema. Vous pouvez également utiliser d’autres classes dans .NET Framework, telles que les classes XmlReader et XmlWriter, pour analyser et écrire un flux de données XML.This is an alternative to using other classes in the .NET Framework, such as the XmlReader and XmlWriter classes, to parse and write an XML stream. Pour plus d’informations, consultez Documents et données XML.For more information, see XML Documents and Data. Ces classes vous permettent d'analyser tout flux de données XML.These classes allow you to parse any XML stream. À l’inverse, utilisez XmlSerializer si le flux de données XML est supposé se conformer à un schéma XML connu.In contrast, use the XmlSerializer when the XML stream is expected to conform to a known XML Schema.

Les attributs contrôlent le flux de données XML généré par la classe XmlSerializer, en vous permettant de définir l’espace de noms XML, le nom d’élément, le nom de l’attribut, etc. du flux de données XML.Attributes control the XML stream generated by the XmlSerializer class, allowing you to set the XML namespace, element name, attribute name, and so on, of the XML stream. Pour plus d’informations sur ces attributs et sur la manière dont ils contrôlent la sérialisation XML, consultez Contrôle de la sérialisation XML à l’aide d’attributs.For more information about these attributes and how they control XML serialization, see Controlling XML Serialization Using Attributes. Pour obtenir une liste des attributs utilisés pour contrôler le code XML généré, consultez Attributs qui contrôlent la sérialisation XML.For a table of those attributes that are used to control the generated XML, see Attributes That Control XML Serialization.

De plus, la classe XmlSerializer peut sérialiser un objet et générer un flux de données XML encodé selon le protocole SOAP.The XmlSerializer class can further serialize an object and generate an encoded SOAP XML stream. Le XML généré est conforme à la section 5 du document World Wide Web Consortium intitulé « Protocole SOAP (Simple Object Access Protocol) 1.1 ».The generated XML adheres to section 5 of the World Wide Web Consortium document titled "Simple Object Access Protocol (SOAP) 1.1." Pour plus d’informations sur ce processus, consultez Comment : Sérialiser un objet comme un Stream XML encodés en SOAP.For more information about this process, see How to: Serialize an Object as a SOAP-Encoded XML Stream. Pour obtenir une liste des attributs utilisés pour contrôler le code XML généré, consultez Attributs qui contrôlent la sérialisation encodée selon le protocole SOAP.For a table of the attributes that control the generated XML, see Attributes That Control Encoded SOAP Serialization.

La classe XmlSerializer génère les messages SOAP créés par les services web XML et passés à ces derniers.The XmlSerializer class generates the SOAP messages created by, and passed to, XML Web services. Pour contrôler les messages SOAP, vous pouvez appliquer des attributs aux classes, valeurs de retour, paramètres et champs trouvés dans un fichier de services Web XML (.asmx).To control the SOAP messages, you can apply attributes to the classes, return values, parameters, and fields found in an XML Web service file (.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 encodée selon le protocole SOAP » car un service Web XML peut utiliser le style SOAP littéral ou encodé.You can use both the attributes listed in "Attributes That Control XML Serialization" and "Attributes That Control Encoded SOAP Serialization" because an XML Web service can use either the literal or encoded SOAP style. Pour plus d’informations sur l’utilisation d’attributs pour contrôler le code XML généré par un service web XML, consultez Sérialisation XML avec les services web XML.For more information about using attributes to control the XML generated by an XML Web service, see XML Serialization with XML Web Services. Pour plus d’informations sur les services Web XML et SOAP, consultez personnalisation de formatage de Message SOAP.For more information about SOAP and XML Web services, see Customizing SOAP Message Formatting.

Considérations relatives à la sécurité des applications XmlSerializerSecurity Considerations for XmlSerializer Applications

Quand vous créez une application qui utilise la classe XmlSerializer, tenez compte des points suivants et de leurs implications :When creating an application that uses the XmlSerializer, you should be aware of the following items and their implications:

  • XmlSerializer crée des fichiers C# (.cs) et les compile dans des fichiers .dll dans le répertoire nommé par la variable d’environnement TEMP. La sérialisation s’effectue ensuite avec ces DLL.The XmlSerializer creates C# (.cs) files and compiles them into .dll files in the directory named by the TEMP environment variable; serialization occurs with those DLLs.

    Notes

    Ces assemblys de sérialisation peuvent être générés en avance et signés à l'aide de l'outil SGen.exe.These serialization assemblies can be generated in advance and signed by using the SGen.exe tool. Cela ne fonctionne pas avec un serveur de services Web.This does not work a server of Web services. En d'autres termes, ces assemblys sont réservés à une utilisation par le client et à une sérialisation manuelle.In other words, it is only for client use and for manual serialization.

    Le code et les dll sont vulnérables face à un processus malveillant lors de leur création et de leur compilation.The code and the DLLs are vulnerable to a malicious process at the time of creation and compilation. Lors de l'utilisation d'un ordinateur qui exécute Microsoft Windows NT 4.0 ou version ultérieure, deux utilisateurs ou plus peuvent partager le répertoire TEMP.When using a computer running Microsoft Windows NT 4.0 or later, it might be possible for two or more users to share the TEMP directory. Le partage d’un répertoire TEMP est dangereux si les deux comptes ont des privilèges de sécurité différents et que le compte doté des privilèges les plus élevés exécute une application utilisant XmlSerializer.Sharing a TEMP directory is dangerous if the two accounts have different security privileges and the higher-privilege account runs an application using the XmlSerializer. Dans ce cas, un utilisateur peut percer la sécurité de l'ordinateur en remplaçant le fichier .cs ou .dll compilé.In this case, one user can breach the computer's security by replacing either the .cs or .dll file that is compiled. Pour éliminer ce problème, vérifiez toujours que chaque compte de l'ordinateur dispose de son propre profil.To eliminate this concern, always be sure that each account on the computer has its own profile. Par défaut, la variable d'environnement TEMP pointe vers un répertoire différent pour chaque compte.By default, the TEMP environment variable points to a different directory for each account.

  • Si un utilisateur malveillant envoie un flux de données XML continu à un serveur web (attaque par déni de service), XmlSerializer continue de traiter les données jusqu’à ce que l’ordinateur manque de ressources.If a malicious user sends a continuous stream of XML data to a Web server (a denial of service attack), then the XmlSerializer continues to process the data until the computer runs low on resources.

    Ce type d'attaque est éliminé si vous utilisez un ordinateur qui exécute des Services Internet (IIS) et que votre application s'exécute dans IIS.This kind of attack is eliminated if you are using a computer running Internet Information Services (IIS), and your application is running within IIS. IIS comprend une porte qui ne traite pas les flux de données supérieurs à une quantité définie (la valeur par défaut correspond à 4 Ko).IIS features a gate that does not process streams longer than a set amount (the default is 4 KB). Si vous créez une application qui n’utilise pas IIS et qui désérialise les données à l’aide de XmlSerializer, vous devez implémenter une porte semblable pour empêcher une attaque par déni de service.If you create an application that does not use IIS and deserializes with the XmlSerializer, you should implement a similar gate that prevents a denial of service attack.

  • XmlSerializer sérialise les données et exécute tout type de code.The XmlSerializer serializes data and runs any code using any type given to it.

    Un objet malveillant présente une menace dans deux situations.There are two ways in which a malicious object presents a threat. Il peut exécuter du code malveillant ou injecter du code malveillant dans le fichier C# créé par XmlSerializer.It could run malicious code or it could inject malicious code into the C# file created by the XmlSerializer. Dans le premier cas, si un objet malveillant essaie d'exécuter une procédure destructrice, la sécurité d'accès du code empêche tout préjudice éventuel.In the first case, if a malicious object tries to run a destructive procedure, code access security helps prevent any damage from being done. Dans le deuxième cas, il est possible, en théorie, qu’un objet malveillant puisse injecter d’une façon ou d’une autre du code dans le fichier C# créé par XmlSerializer.In the second case, there is a theoretical possibility that a malicious object may somehow inject code into the C# file created by the XmlSerializer. Bien que ce problème ait été étudié de manière approfondie et qu'une telle attaque soit considérée comme improbable, veillez à ne jamais sérialiser de données de type inconnu et non fiable.Although this issue has been examined thoroughly, and such an attack is considered unlikely, you should take the precaution of never serializing data with an unknown and untrusted type.

  • Les données sensibles sérialisées peuvent être vulnérables.Serialized sensitive data might be vulnerable.

    Après le XmlSerializer a sérialisé des données, il peut être stocké comme un fichier XML ou autre magasin de données.After the XmlSerializer has serialized data, it can be stored as an XML file or other data store. Si d'autres processus peuvent accéder à votre magasin de données, ou que celui-ci est visible sur un intranet ou sur Internet, les données peuvent être volées et utilisées de manière malveillante.If your data store is available to other processes, or is visible on an intranet or the Internet, the data can be stolen and used maliciously. Par exemple, si vous créez une application qui sérialise des commandes qui incluent des numéros de carte de crédit, les données sont très sensibles.For example, if you create an application that serializes orders that include credit card numbers, the data is highly sensitive. Pour empêcher cela, protégez toujours votre magasin de données et prenez les mesures nécessaires pour assurer sa confidentialité.To help prevent this, always protect the store for your data and take steps to keep it private.

Sérialisation d'une classe simpleSerialization of a Simple Class

L'exemple de code suivant affiche une classe de base avec un champ public.The following code example shows a basic class with a public field.

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 se présenter comme suit.When an instance of this class is serialized, it might resemble the following.

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

Pour obtenir plus d’exemples de sérialisation, consultez Exemples de sérialisation XML.For more examples of serialization, see Examples of XML Serialization.

Éléments qui peuvent être sérialisésItems That Can Be Serialized

Les éléments suivants peuvent être sérialisés à l’aide de la classe XmLSerializer :The following items can be serialized using the XmLSerializer class:

  • Propriétés publiques de lecture/écriture et champs de classes publiques.Public read/write properties and fields of public classes.

  • Classes qui implémentent ICollection ou IEnumerable.Classes that implement ICollection or IEnumerable.

    Notes

    Seules les collections sont sérialisées, pas les propriétés publiques.Only collections are serialized, not public properties.

  • Objets XmlElement.XmlElement objects.

  • Objets XmlNode.XmlNode objects.

  • Objets DataSet.DataSet objects.

Pour plus d’informations sur la sérialisation ou la désérialisation d’objets, consultez Comment : Sérialiser un objet et Comment : Désérialiser un objet.For more information about serializing or deserializing objects, see How to: Serialize an Object and How to: Deserialize an Object.

Avantages de l'utilisation de la sérialisation XMLAdvantages of Using XML Serialization

Le XmlSerializer classe vous donne un contrôle complet et flexible lorsque vous sérialisez un objet au format XML.The XmlSerializer class gives you complete and flexible control when you serialize an object as XML. Si vous créez un service Web XML, vous pouvez appliquer des attributs qui contrôlent la sérialisation des classes et des membres pour garantir que le résultat XML se conforme à un schéma spécifique.If you are creating an XML Web service, you can apply attributes that control serialization to classes and members to ensure that the XML output conforms to a specific schema.

Par exemple, XmlSerializer vous permet d’effectuer les opérations suivantes :For example, XmlSerializer enables you to:

  • Spécifier si un champ ou une propriété doit être encodé comme un attribut ou un élément.Specify whether a field or property should be encoded as an attribute or an element.

  • Spécifier un espace de noms XML à utiliser.Specify an XML namespace to use.

  • Spécifier le nom d'un élément ou d'un attribut si le nom d'un champ ou d'une propriété n'est pas approprié.Specify the name of an element or attribute if a field or property name is inappropriate.

Un autre avantage de la sérialisation XML est qu'aucune contrainte n'est définie sur les applications que vous développez, tant que le flux de données XML généré se conforme à un schéma donné.Another advantage of XML serialization is that you have no constraints on the applications you develop, as long as the XML stream that is generated conforms to a given schema. Imaginez un schéma utilisé pour décrire des livres.Imagine a schema that is used to describe books. Il comprend un titre, un auteur, un éditeur et un élément de numéro ISBN.It features a title, author, publisher, and ISBN number element. Vous pouvez développer une application qui traite les données XML de la manière dont vous le souhaitez, par exemple, comme une commande ou un inventaire de livres.You can develop an application that processes the XML data in any way you want, for example, as a book order, or as an inventory of books. Dans les deux cas, la seule spécification consiste en ce que le flux de données XML se conforme au schéma XSD spécifié.In either case, the only requirement is that the XML stream conforms to the specified XML Schema definition language (XSD) schema.

Considérations sur la sérialisation XMLXML Serialization Considerations

Si vous utilisez la classe XmlSerializer, tenez compte des points suivants :The following should be considered when using the XmlSerializer class:

  • L'outil Sgen.exe est conçu expressément pour générer des assemblys de sérialisation en vue d'obtenir des performances optimales.The Sgen.exe tool is expressly designed to generate serialization assemblies for optimum performance.

  • Les données sérialisées ne contiennent que les données elles-mêmes et la structure de vos classes.The serialized data contains only the data itself and the structure of your classes. Les informations relatives à l'identité et aux assemblys ne sont pas incluses.Type identity and assembly information are not included.

  • Seuls les champs et les propriétés publics peuvent être sérialisés.Only public properties and fields can be serialized. Les propriétés doivent disposer d'accesseurs publics (méthodes get et set).Properties must have public accessors (get and set methods). Si vous devez sérialiser des données non publiques, utilisez la classe DataContractSerializer plutôt que la sérialisation XML.If you must serialize non-public data, use the DataContractSerializer class rather than XML serialization.

  • Une classe doit avoir un constructeur sans paramètre pour être sérialisée par XmlSerializer.A class must have a parameterless constructor to be serialized by XmlSerializer.

  • Les méthodes ne peuvent pas être sérialisées.Methods cannot be serialized.

  • XmlSerializer peut traiter des classes qui implémentent différemment IEnumerable ou ICollection si elles répondent aux exigences ci-après.XmlSerializer can process classes that implement IEnumerable or ICollection differently if they meet certain requirements, as follows.

    Une classe qui implémente IEnumerable doit implémenter une méthode Add publique qui accepte un seul paramètre.A class that implements IEnumerable must implement a public Add method that takes a single parameter. Le paramètre de la méthode Add doit être cohérent (polymorphe) avec le type retourné par la propriété IEnumerator.Current qui est retournée par la méthode GetEnumerator.The Add method's parameter must be consistent (polymorphic) with the type returned from the IEnumerator.Current property returned from the GetEnumerator method.

    Une classe qui implémente ICollection en plus de IEnumerable (comme CollectionBase) doit avoir une propriété Item publique indexée (un indexeur dans C#) qui accepte un entier et avoir une propriété Count publique de type integer.A class that implements ICollection in addition to IEnumerable (such as CollectionBase) must have a public Item indexed property (an indexer in C#) that takes an integer and it must have a public Count property of type integer. Le paramètre passé à la méthode Add doit être du même type que celui retourné par la propriété Item ou correspondre à l’une des bases de ce type.The parameter passed to the Add method must be the same type as that returned from the Item property, or one of that type's bases.

    Dans le cas de classes qui implémentent ICollection, les valeurs à sérialiser sont récupérées à partir de la propriété Item indexée et non en appelant GetEnumerator.For classes that implement ICollection, values to be serialized are retrieved from the indexed Item property rather than by calling GetEnumerator. Par ailleurs, les propriétés et les champs publics ne sont pas sérialisés, à l’exception des champs publics qui retournent une autre classe de collection (une classe qui implémente ICollection).Also, public fields and properties are not serialized, with the exception of public fields that return another collection class (one that implements ICollection). Pour obtenir un exemple, consultez Exemples de sérialisation XML.For an example, see Examples of XML Serialization.

Mappage de type de données XSDXSD Data Type Mapping

Le document du W3C intitulé XML Schema Part 2 : Types de données spécifie les types de données simples qui sont autorisés dans un schéma XML Schema definition language (XSD).The W3C document titled XML Schema Part 2: Datatypes specifies the simple data types that are allowed in an XML Schema definition language (XSD) schema. Pour la plupart d’entre eux (par exemple, int et decimal), il existe un type de données correspondant dans .NET Framework.For many of these (for example, int and decimal), there is a corresponding data type in the .NET Framework. Toutefois, ce n’est pas le cas pour certains types de données XML (par exemple, le type de données NMTOKEN).However, some XML data types do not have a corresponding data type in the .NET Framework (for example, the NMTOKEN data type). Dans de tels cas, si vous utilisez l’outil XML Schema Definition (Xsd.exe) pour créer des classes à partir d’un schéma, un attribut approprié est appliqué à un membre de type String et sa propriété DataType a pour valeur le nom du type de données XML.In such cases, if you use the XML Schema Definition tool (XML Schema Definition Tool (Xsd.exe)) to generate classes from a schema, an appropriate attribute is applied to a member of type string, and its DataType property is set to the XML data type name. Par exemple, si un schéma contient un élément nommé « MyToken » et ayant le type de données XML NMTOKEN, la nouvelle classe peut contenir un membre tel qu’illustré dans l’exemple suivant.For example, if a schema contains an element named "MyToken" with the XML data type NMTOKEN, the generated class might contain a member as shown in the following example.

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

De la même façon, si vous créez une classe qui doit se conformer à un schéma XML spécifique (XSD), vous devez appliquer l’attribut approprié et assigner à sa propriété DataType le nom de type de données XML souhaité.Similarly, if you are creating a class that must conform to a specific XML Schema (XSD), you should apply the appropriate attribute and set its DataType property to the desired XML data type name.

Pour obtenir une liste complète des mappages de types, consultez la propriété DataType pour chacune des classes d’attributs suivantes :For a complete list of type mappings, see the DataType property for any of the following attribute classes:

Voir aussiSee also