Microsoft hat die Bedeutung der Serialisierung von Daten erkannt und daher die Namespaces System.Runtime.Serialization und System.xml.Serialization in das .NET-Framework aufgenommen, um Serialisierungsfunktionen bereitzustellen und Benutzern das Schreiben ihrer eigenen Serialisierungsmethoden zu ermöglichen, die ein Framework bereitstellen . Der System.Xml.Serialization-Namespace bietet grundlegende Methoden zum Serialisieren eines Objekts in das XML-Format. Werfen wir einen Blick auf die Verwendung dieser Methode.
Der Charme von XML
Serialisiertes XML bezieht sich auf das Speichern der öffentlichen Felder und Attribute eines Objekts in einem seriellen Format (hier XML-Format), um den Speicher- oder Übertragungsprozess zu erleichtern. Bei der Deserialisierung werden serielle Statusinformationen verwendet, um ein Objekt von seinem seriellen XML-Status in seinen ursprünglichen Status wiederherzustellen. Daher können Sie sich Serialisierung als eine Methode zum Speichern des Status eines Objekts in einem Stream oder Puffer vorstellen.
Der Zweck der Serialisierung ist die Datenspeicherung und Datenkonvertierung. Unter Datenspeicherung versteht man das Speichern von Daten über Benutzersitzungen hinweg. Wenn die Anwendung geschlossen wird, werden die Daten gespeichert (serialisiert) und wenn der Benutzer zurückkommt, werden die Daten neu geladen (deserialisiert). Unter Datenkonvertierung versteht man die Umwandlung von Daten in ein Format, das von einem anderen System verstanden werden kann. Mithilfe von Serialisierung und XML kann die Datenkonvertierung einfach durchgeführt werden.
Die Daten im Objekt können Klassen, Methoden, Eigenschaften, private Typen, Arrays und in System.Xml.XmlElement- oder System.Xml.XmlAttribute-Objekten sogar eingebettetes XML sein.
Die Schlüsselklasse im System.Xml.Serialization-Namespace ist XmlSerializer. Natürlich sind auch andere Aspekte von XML- und SOAP-bezogenen Klassen in diesem Namespace enthalten, aber unser Fokus liegt auf der XmlSerializer-Klasse.
XmlSerializer
Die XmlSerializer-Klasse stellt Methoden zum Serialisieren von Objekten in XML-Dateien und zum Deserialisieren von XML-Dokumenten in Objekte bereit. Außerdem können Benutzer festlegen, wie Objekte in XML konvertiert werden. Sie können den Typ des zu serialisierenden Objekts als Parameter an den Klassenkonstruktor übergeben. Der folgende C#-Code veranschaulicht die Verwendung des Konstruktors.
XmlSerializer ser = new XmlSerializer(typeof(objectToSerialize));
Das Folgende ist der entsprechende VB.NET-Code:
Dim ser As New XmlSerializer(GetType(objectToSerialize))
Der eigentliche Serialisierungsprozess wird in der Serialize-Methode der XmlSerializer-Klasse implementiert. Diese Methode ermöglicht den Aufruf von TextWriter-, Stream- und XmlWriter-Objekten während der Serialisierung. Der folgende Beispielcode veranschaulicht, wie diese Methode aufgerufen wird. In diesem Beispiel wird ein Objekt serialisiert und in einer Datei auf der lokalen Festplatte gespeichert. Das Beispiel beginnt mit der Klassendeklaration, gefolgt vom serialisierten Quellcode.
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(); } } }
Der obige Code wandelt drei Objekte in ein Objekt um und generiert so während des Serialisierungsprozesses eine XML-Datei. Das Folgende ist das vom Beispielprogramm generierte XML-Dokument:
<?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>
Beachten Sie, dass der Serialisierungsprozess auch die Verschachtelung von Objektdaten verarbeiten kann. Die Daten werden in ein erkennbares Format konvertiert, was das Nachladen der Daten (Deserialisierung) und die Datenübertragung in ein anderes System erleichtert. Während des Datenübertragungsprozesses muss das empfangende System das Format der XML-Datei kennen (sofern es es nicht im Voraus kennt). Daher muss eine XML-Schemadatei bereitgestellt werden. Das Tool XSD.exe im .NET Framework kann eine Schemadatei für serialisiertes XML generieren.
Das Folgende ist ein in VB.NET geschriebener Beispielcode:
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
Steuerausgabe
Der Serialisierungsprozess generiert eine Standard-XML-Datei und die Datenelemente werden konvertiert in XML-Elemente. Allerdings werden nicht alle Datenelemente zu Elementen. Sie können die Ausgabe-XML-Datei steuern, indem Sie dem Klassencode einige Tags hinzufügen. Auf diese Weise können Datenelemente in XML-Attribute statt in Elemente konvertiert oder einfach ignoriert werden. Das folgende Beispiel ist ein modifizierter VB.NET-Code der Buchklasse.
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
Dieser Code weist das System an, beim Generieren der XML-Datei das Klassenmitglied ISBN als XML-Attribut zu verwenden und das RetailPrice-Mitglied zu ignorieren. Diese Änderung ist in der generierten XML-Datei zu sehen:
<?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>
Das Folgende ist der entsprechende C#-Code:
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; }
Die beiden Markup-Symbole werden oben nur geringfügig erwähnt. Die vollständige Markup-Notation finden Sie in der .NET-Dokumentation.
Deserialisierung
Deserialisierte Daten können einfach durch Aufrufen der Deserialize-Methode der XmlSerializer-Klasse erreicht werden. Das folgende VB.NET-Programmfragment vervollständigt die Deserialisierung des oben genannten XML-Dokuments:
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));
Das Obige ist der Inhalt der Verwendung von XMLSerializer zum Serialisieren von Objekten in XML. Weitere verwandte Inhalte finden Sie unter PHP chinesische Website (www.php.cn)!