Maison  >  Article  >  développement back-end  >  Sérialiser des objets en XML à l'aide de XMLSerializer

Sérialiser des objets en XML à l'aide de XMLSerializer

黄舟
黄舟original
2017-03-02 17:24:311710parcourir

Microsoft a réalisé l'importance de la sérialisation des données, c'est pourquoi le framework .NET inclut les espaces de noms System.Runtime.Serialization et System.xml.Serialization pour fournir des fonctions de sérialisation et permettre aux utilisateurs d'écrire leurs propres méthodes de sérialisation. L'espace de noms System.Xml.Serialization fournit des méthodes de base pour sérialiser un objet au format XML. Voyons comment utiliser cette méthode.

Le charme du XML

Le XML sérialisé fait référence à la sauvegarde des champs publics et des attributs d'un objet dans un format série (ici, le format XML) pour faciliter le processus de stockage ou de transmission. La désérialisation est le processus d'utilisation des informations d'état série pour restaurer un objet de son état XML série à son état d'origine. Par conséquent, vous pouvez considérer la sérialisation comme une méthode permettant de sauvegarder l’état d’un objet dans un flux ou un tampon.

Le but de la sérialisation est le stockage et la conversion des données. Le stockage des données fait référence à la sauvegarde des données entre les sessions utilisateur. A la fermeture de l'application, les données sont enregistrées (sérialisées) et au retour de l'utilisateur, les données sont rechargées (désérialisées). La conversion de données fait référence à la transformation des données dans un format pouvant être compris par un autre système. Grâce à la sérialisation et au XML, la conversion des données peut être facilement effectuée.

Les données de l'objet peuvent être des classes, des méthodes, des propriétés, des types privés, des tableaux, et dans les objets System.Xml.XmlElement ou System.Xml.XmlAttribute, elles peuvent même être du XML intégré.

La classe clé dans l'espace de noms System.Xml.Serialization est XmlSerializer. Bien entendu, cet espace de noms inclut également d'autres classes liées à d'autres aspects de XML et SOAP, mais nous nous concentrons sur la classe XmlSerializer.

XmlSerializer
La classe XmlSerializer fournit des méthodes pour sérialiser des objets en fichiers XML et désérialiser des documents XML en objets. Il permet également aux utilisateurs de spécifier comment les objets sont convertis en XML. Vous pouvez transmettre le type d'objet à sérialiser en tant que paramètre au constructeur de classe. Le code C# suivant illustre l'utilisation du constructeur.

    XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));

Voici le code VB.NET équivalent :

    Dim ser As New XmlSerializer(GetType(objectToSerialize))

Le processus de sérialisation réel est implémenté dans la méthode Serialize de la classe XmlSerializer. Cette méthode permet d'appeler des objets TextWriter, Stream et XmlWriter lors de la sérialisation. L'exemple de code suivant illustre comment appeler cette méthode. Dans cet exemple, un objet est sérialisé et enregistré dans un fichier sur le disque local. L'exemple commence par la déclaration de classe, suivie du code source sérialisé.

using System;
namespace BuilderSerialization {
public class Address {
public Address() {}
public string Address1;
public string Address2;
public string City;
public string State;
public string Zip;
public string Country;
} }
using System;
namespace BuilderSerialization {
public class Author {
public Author() { }
public string FirstName;
public string MiddleName;
public string LastName;
public string Title;
public string Gender;
public Address AddressObject;
} }
namespace BuilderSerialization {
public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
public string ISBN;
public double RetailPRice;
public string Publisher;
}}
using System;
using System.Xml.Serialization;
using System.IO;
namespace BuilderSerialization {
class TestClass {
static void Main(string[] args) {
Book BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriter writer = new StreamWriter("booktest.xml");
BookObject.Title = "Practical LotusScript";
BookObject.ISBN = "1884777767 ";
BookObject.Publisher = "Manning Publications";
BookObject.RetailPrice = 43.95;
BookObject.AuthorObject = new Author();
BookObject.AuthorObject.FirstName = "Tony";
BookObject.AuthorObject.LastName = "Patton";
BookObject.AuthorObject.Gender = "Male";
BookObject.AuthorObject.AddressObject = new Address();
BookObject.AuthorObject.AddressObject.Address1 = "1 Main Street";
BookObject.AuthorObject.AddressObject.City = "Anywhere";
BookObject.AuthorObject.AddressObject.State = "KY";
BookObject.AuthorObject.AddressObject.Zip = "40000";
BookObject.AuthorObject.AddressObject.Country = "USA";
ser.Serialize(writer, BookObject);
writer.Close();
} } }

Le code ci-dessus transforme trois objets en un seul objet, générant ainsi un fichier XML pendant le processus de sérialisation. Voici le document XML généré par l'exemple de programme :

<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Title>Practical LotusScript</Title>
<AuthorObject>
<FirstName>Tony</FirstName>
<LastName>Patton</LastName>
<Gender>Male</Gender>
<AddressObject>
<Address1>1 Main Street</Address1>
<City>Anywhere</City>
<State>KY</State>
<Zip>40000</Zip>
<Country>USA</Country>
</AddressObject>
</AuthorObject>
<ISBN>1884777767 </ISBN>
<RetailPrice>43.95</RetailPrice>
<Publisher>Manning Publications</Publisher>
</Book>

Notez que le processus de sérialisation peut également gérer l'imbrication des données d'objet. Les données sont converties dans un format reconnaissable, ce qui facilite le rechargement des données (désérialisation) et le transfert de données vers un autre système. Lors du processus de transfert de données, le système récepteur a besoin de connaître le format du fichier XML (s'il ne le connaît pas à l'avance). Par conséquent, un fichier de schéma XML doit être fourni. L'outil XSD.exe du .NET Framework peut générer un fichier de schéma pour le XML sérialisé.

Ce qui suit est un exemple de code écrit en VB.NET :

Public Class Address
Public Address1 As String
Public Address2 As String
Public City As String
Public State As String
Public Zip As String
Public Country As String
End Class
Public Class Author
Public FirstName As String
Public MiddleName As String
Public LastName As String
Public Title As String
Public Gender As String
Public AddressObject As Address
End Class
Public Class Book
Public AuthorObject As Author
Public Title As String
Public ISBN As String
Public RetailPrice As Double
Public Publisher As String
End Class
Imports System.Xml.Serialization
Imports System.IO
Module Module1
Sub Main()
Dim BookObject As New Book
Dim ser As New XmlSerializer(GetType(Book))
Dim writer As New StreamWriter("booktest.xml")
With BookObject
.Title = "Practical LotusScript"
.ISBN = "1884777767 "
.Publisher = "Manning Publications"
.RetailPrice = 43.95
.AuthorObject = New Author
.AuthorObject.FirstName = "Tony"
.AuthorObject.LastName = "Patton"
.AuthorObject.Gender = "Male"
.AuthorObject.AddressObject = New Address
.AuthorObject.AddressObject.Address1 = "1 Main Street"
.AuthorObject.AddressObject.City = "Anywhere"
.AuthorObject.AddressObject.State = "KY"
.AuthorObject.AddressObject.Zip = "40000"
.AuthorObject.AddressObject.Country = "USA"
End With
ser.Serialize(writer, BookObject)
writer.Close()
End Sub
End Module

Sortie de contrôle

Le processus de sérialisation génère un fichier XML standard et les données membres sont converties en éléments XML. Toutefois, toutes les données membres ne deviennent pas des éléments. Vous pouvez contrôler le fichier XML de sortie en ajoutant des balises dans le code de classe. De cette façon, les données membres peuvent être converties en attributs XML plutôt qu'en éléments, ou simplement ignorées. L'exemple suivant est un code VB.NET de classe de livre modifié.

Public Class Book
Public AuthorObject As Author
Public Title As String
<System.Xml.Serialization.XmlAttribute()> _
Public ISBN As String
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Public RetailPrice As Double
Public Publisher As String
End Class

Ce code indique au système d'utiliser le membre de classe ISBN comme attribut XML lors de la génération du fichier XML, tout en ignorant le membre RetailPrice. Ce changement est visible dans le fichier XML généré :

<?xml version="1.0" encoding="utf-8"?>
<Book xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ISBN="1884777767 ">
<AuthorObject>
<FirstName>Tony</FirstName>
<LastName>Patton</LastName>
<Gender>Male</Gender>
<AddressObject>
<Address1>1 Main Street</Address1>
<City>Anywhere</City>
<State>KY</State>
<Zip>40000</Zip>
<Country>USA</Country>
</AddressObject>
</AuthorObject>
<Title>Practical LotusScript</Title>
<Publisher>Manning Publications</Publisher>
</Book>

Voici le code C# correspondant :

public class Book {
public Book() { }
public string Title;
public Author AuthorObject;
[System.Xml.Serialization.XmlAttribute()]
public string ISBN;
[System.Xml.Serialization.XmlIgnoreAttribute()]
public double RetailPrice;
public string Publisher;
}

Les deux symboles de balisage ne sont que légèrement mentionnés ci-dessus. Veuillez consulter la documentation .NET pour la notation de balisage complète.

Désérialisation
Les données désérialisées peuvent être facilement obtenues en appelant la méthode Deserialize de la classe XmlSerializer. Le fragment de programme VB.NET suivant termine la désérialisation du document XML mentionné ci-dessus :

Dim BookObject As New Book
Dim ser As New XmlSerializer(GetType(Book))
Dim fs As New System.IO.FileStream("booktest.xml", FileMode.Open)
Dim reader As New System.XML.XmlTextReader(fs)
BookObject = CType(ser.Deserialize(reader), Book)
该程序把结果数据放入内存备用。下面是等价的C# 代码:
XmlSerializer ser = new XmlSerializer(typeof(Book));
System.IO.FileStreamfs = new System.IO.FileStream("booktest.xml",
FileMode.Open);
System.Xml.XmlTextReader reader = new System.Xml.XmlTextReader(fs);
Book BookObject = (Book)(ser.Deserialize(reader));

Ce qui précède est le contenu de l'utilisation de XMLSerializer pour sérialiser des objets en XML. Pour plus de contenu connexe, veuillez prêter attention au. Site Web chinois PHP (www.php.cn) !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn