Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La sérialisation est le processus de conversion d’un objet en un formulaire qui peut être facilement transporté. Par exemple, vous pouvez sérialiser un objet et le transporter via Internet à l’aide de HTTP entre un client et un serveur. En revanche, la désérialisation reconstruit l’objet à partir du flux.
La sérialisation XML sérialise uniquement les champs publics et les valeurs de propriété d’un objet dans un flux XML. La sérialisation XML n’inclut pas d’informations de type. Par exemple, si vous avez un objet Book qui existe dans l’espace de noms Bibliothèque , il n’existe aucune garantie qu’il est désérialisé dans un objet du même type.
Remarque
La sérialisation XML ne convertit pas les méthodes, les indexeurs, les champs privés ou les propriétés en lecture seule (à l’exception des collections en lecture seule). Pour sérialiser tous les champs et propriétés d’un objet, tant publics que privés, utilisez DataContractSerializer au lieu de la sérialisation XML.
La classe centrale dans la sérialisation XML est la XmlSerializer classe, et les méthodes les plus importantes de cette classe sont les méthodes Serialize et Deserialize . Le XmlSerializer crée des fichiers C# et les compile en fichiers .dll pour effectuer cette sérialisation. L’outil Générateur de sérialiseur XML (Sgen.exe) est conçu pour générer ces assemblys de sérialisation à l’avance à déployer avec votre application et améliorer les performances de démarrage. Le flux XML généré par XmlSerializer est conforme à la recommandation du World Wide Web Consortium (W3C) en matière de langage de définition de schéma XML (XSD) 1.0. En outre, les types de données générés sont conformes au document intitulé « Xml Schema Part 2 : Datatypes ».
Les données de vos objets sont décrites à l’aide de constructions de langage de programmation telles que des classes, des champs, des propriétés, des types primitifs, des tableaux et même du code XML incorporé sous la forme d’objets XmlElement ou XmlAttribute . Vous avez la possibilité de créer vos propres classes, annotées avec des attributs ou à l’aide de l’outil De définition de schéma XML 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 De définition de schéma XML pour produire un ensemble de classes fortement typées dans le schéma et annotées avec des attributs. Lorsqu’une instance de cette classe est sérialisée, le code XML généré respecte le schéma XML. Fourni avec une telle classe, vous pouvez programmer contre un modèle objet facilement manipulé tout en étant assuré que le code XML généré est conforme au schéma XML. Il s’agit d’une alternative à l’utilisation d’autres classes dans .NET, telles que les classes XmlReader et XmlWriter , pour analyser et écrire un flux XML. Pour plus d’informations, consultez Documents et données XML. Ces classes vous permettent d’analyser n’importe quel flux XML. En revanche, utilisez le xmlSerializer lorsque le flux XML est censé être conforme à 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 d’élément, le nom d’attribut, et ainsi de suite, du flux XML. Pour plus d’informations sur ces attributs et la façon dont ils contrôlent la sérialisation XML, consultez Contrôle de la sérialisation XML à l’aide d’attributs. Pour obtenir une table de ces attributs utilisés pour contrôler le code XML généré, consultez Attributs qui contrôlent la sérialisation XML.
La classe XmlSerializer peut sérialiser un objet et générer un flux XML SOAP encodé. Le code XML généré respecte la section 5 du document World Wide Web Consortium intitulé « Protocole SOAP (Simple Object Access Protocol) 1.1 ». Pour plus d’informations sur ce processus, consultez How to : Serialize an Object as a SOAP-Encoded XML Stream. Pour obtenir une table des attributs qui contrôlent le code XML généré, consultez Attributs qui contrôlent la sérialisation SOAP encodée.
La classe XmlSerializer génère les messages SOAP créés par et transmis aux services Web XML. Pour contrôler les messages SOAP, vous pouvez appliquer des attributs aux classes, retourner des valeurs, des paramètres et des champs trouvés dans un fichier de service web XML (.asmx). Vous pouvez utiliser les deux attributs répertoriés dans « Attributs qui contrôlent la sérialisation XML » et « Attributs qui contrôlent la sérialisation SOAP encodée », car un service Web XML peut utiliser le style SOAP littéral ou encodé. 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 des services web XML. Pour plus d’informations sur les services web SOAP et XML, consultez Personnalisation de la mise en forme des messages SOAP.
Considérations relatives à la sécurité pour les applications XmlSerializer
Lors de la création d’une application qui utilise xmlSerializer, tenez compte des éléments suivants et de 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 se produit avec ces DLL.
Remarque
Ces assemblages de sérialisation peuvent être générés préalablement et signés à l’aide de l’outil SGen.exe. Cela ne fonctionne pas sur un serveur de services Web. En d'autres termes, il est destiné uniquement à l'usage du client et à la sérialisation manuelle.
Le code et les DLL sont vulnérables à un processus malveillant au moment de la création et de la compilation. Il est possible que deux utilisateurs ou plus partagent le répertoire TEMP. 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 à privilèges supérieurs exécute une application à l’aide du xmlSerializer. Dans ce cas, un utilisateur peut violer la sécurité de l’ordinateur en remplaçant le fichier .cs ou .dll compilé. Pour éliminer ce problème, assurez-vous toujours 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 à un serveur Web (attaque par déni de service), le 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 exécutant Internet Information Services (IIS) et que votre application s’exécute dans IIS. IIS propose une porte qui ne traite pas les flux plus longs qu’un montant défini (la valeur par défaut est de 4 Ko). Si vous créez une application qui n’utilise pas IIS et désérialise avec xmlSerializer, vous devez implémenter une porte similaire qui empêche une attaque par déni de service.
XmlSerializer sérialise les données et exécute n’importe quel code à l’aide d’un type donné.
Il existe deux façons dont un objet malveillant présente une menace. Il peut exécuter du code malveillant ou injecter du code malveillant dans le fichier C# créé par xmlSerializer. Dans le deuxième cas, il existe une possibilité théorique qu’un objet malveillant puisse injecter du code dans le fichier C# créé par xmlSerializer. Bien que ce problème ait été examiné de manière approfondie et qu’une telle attaque est considérée comme peu probable, vous devez prendre la précaution de ne jamais sérialiser les données avec un type inconnu et non approuvé.
Les données sensibles sérialisées peuvent être vulnérables.
Une fois que xmlSerializer a sérialisé des données, il peut être stocké en tant que fichier XML ou autre magasin de données. Si votre magasin de données est disponible pour d’autres processus ou est visible sur un intranet ou sur Internet, les données peuvent être volées et utilisées de manière malveillante. Par exemple, si vous créez une application qui sérialise les commandes qui incluent des numéros de carte de crédit, les données sont très sensibles. Pour éviter cela, protégez toujours le stockage de vos données et prenez des mesures pour en préserver la confidentialité.
Sérialisation d’une classe simple
L’exemple de code suivant montre une classe de base 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 plus d’exemples de sérialisation, consultez Exemples de sérialisation XML.
Éléments qui peuvent être sérialisés
Les éléments suivants peuvent être sérialisés à l’aide de la classe XmlSerializer :
Propriétés publiques de lecture/écriture et champs de classes publiques.
Classes qui implémentent ICollection ou IEnumerable.
Remarque
Seules les collections sont sérialisées, et non pas les propriétés publiques.
Objets XmlElement.
Objets XmlNode.
Objets de DataSet
Pour plus d’informations sur la sérialisation ou la désérialisation d’objets, consultez How to : Serialize an Object and How to : Deserialize an Object.
Avantages de l’utilisation de la sérialisation XML
La classe XmlSerializer vous donne un contrôle complet et flexible lorsque vous sérialisez un objet en tant que XML. Si vous créez un service Web XML, vous pouvez appliquer des attributs qui contrôlent la sérialisation aux classes et aux membres pour vous assurer que la sortie XML est conforme à un schéma spécifique.
Par exemple, XmlSerializer vous permet de :
Spécifiez si un champ ou une propriété doit être encodé en tant qu’attribut ou élément.
Spécifiez un espace de noms XML à utiliser.
Spécifiez le nom d’un élément ou d’un attribut si un nom de champ ou de propriété n’est pas approprié.
Un autre avantage de la sérialisation XML est que vous n’avez aucune contrainte sur les applications que vous développez, tant que le flux XML généré est conforme à un schéma donné. Imaginez un schéma utilisé pour décrire les livres. Il contient un titre, auteur, éditeur et numéro ISBN. Vous pouvez développer une application qui traite les données XML de n’importe quelle façon, par exemple, en tant que commande de livre ou en tant qu’inventaire des livres. Dans les deux cas, la seule exigence est que le flux XML soit conforme au schéma XSD (XML Schema Definition Language) 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 expressément conçu pour générer des assemblys de sérialisation pour des performances optimales.
Les données sérialisées contiennent uniquement les données elles-mêmes et la structure de vos classes. Les informations relatives à l'identité et aux assemblys ne sont pas incluses.
Seules les propriétés publiques et les champs peuvent être sérialisés. Les propriétés doivent disposer d'accesseurs publics (méthodes get et set). Si vous devez sérialiser des données non publiques, utilisez la classe DataContractSerializer plutôt que la sérialisation XML.
Une classe doit avoir un constructeur sans paramètre à sérialiser par XmlSerializer.
Les méthodes ne peuvent pas être sérialisées.
XmlSerializer peut traiter des classes qui implémentent IEnumerable ou ICollection différemment si elles répondent à certaines exigences, comme suit.
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é par la propriété IEnumerator.Current retournée par la méthode GetEnumerator .
Une classe qui implémente ICollection en plus d’IEnumerable (par exemple , CollectionBase) doit avoir une propriété indexée Élément public (indexeur en C#) qui prend un entier et qui doit avoir une propriété Count publique de type entier. Le paramètre passé à la méthode Add doit être le 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 récupérées à partir de la propriété Item indexée plutôt qu’en appelant GetEnumerator. En outre, 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 qui implémente ICollection). Pour obtenir un exemple, consultez Exemples de sérialisation XML.
Mappage de type de données XSD
Le document W3C intitulé Xml Schema Part 2 : Datatypes spécifie les types de données simples autorisés dans un schéma XSD (XML Schema Definition Language). Pour la plupart de ces données (par exemple, int et decimal), il existe un type de données correspondant dans .NET. Toutefois, certains types de données XML n’ont pas de type de données .NET correspondant, par exemple, le type de données NMTOKEN . Dans ce 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 chaîne de type et sa propriété DataType est définie sur le 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 illustré dans 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 être conforme à un schéma XML spécifique (XSD), vous devez appliquer l’attribut approprié et définir sa propriété DataType au nom de type de données XML souhaité.
Pour obtenir la liste complète des mappages de types, consultez la propriété DataType pour l’une des classes d’attribut suivantes :