Microsoft hat die Bedeutung serialisierter Daten erkannt und daher die Namespaces System.Runtime.Serialization und System.Xml.Serialization in das .NET-Framework integriert, um Serialisierungsfunktionen bereitzustellen und Benutzern die Möglichkeit zu geben, ihre eigenen Serialisierungsmethoden zu schreiben . 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 den Prozess des Speicherns der öffentlichen Felder und Attribute eines Objekts in einem seriellen Format (hier XML-Format), um die Speicherung oder Übertragung 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 problemlos durchgeführt werden.
Die Daten im Objekt können eine Klasse, Methode, Eigenschaft, ein privater Typ, ein Array oder sogar eingebettetes XML in einem System.Xml.XmlElement- oder System.Xml.XmlAttribute-Objekt sein.
Die Schlüsselklasse im System.Xml.Serialization-Namespace ist XmlSerializer. Natürlich umfasst dieser Namespace auch andere Klassen, die sich auf andere Aspekte von XML und SOAP beziehen, 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 entsprechendeVB.NET
-Code:
Dim ser As New
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.
Verwenden des Systems;
Namespace BuilderSerialization {
öffentliche Klassenadresse {
öffentliche Adresse() {}
öffentliche Zeichenfolge Address1;
öffentliche Zeichenfolge Address2;
öffentliche Zeichenfolge Stadt;
öffentlicher String State;
öffentliche Zeichenfolge Zip;
öffentliche Zeichenfolge Land;
} }
Verwenden des Systems;
Namespace BuilderSerialization {
öffentliche Klasse Autor {
öffentlicher Autor() { }
öffentliche Zeichenfolge FirstName;
öffentliche Zeichenfolge MiddleName;
öffentliche Zeichenfolge Nachname;
öffentlicher String-Titel;
öffentliche Zeichenfolge Geschlecht;
öffentliche Adresse AddressObject;
} }
Namespace BuilderSerialization {
öffentliches Klassenbuch {
öffentliches Buch() { }
öffentlicher String-Titel;
öffentlicher Autor AuthorObject;
öffentliche Zeichenfolge ISBN;
öffentlicher doppelter Einzelhandelspreis;
öffentlicher String-Herausgeber;
}}
Verwenden des Systems;
mit System.Xml.Serialization;
mit System.IO;
Namespace BuilderSerialization {
Klasse TestClass {
static void Main(string[] args) {
Buch BookObject = new Book();
XmlSerializer ser = new XmlSerializer(typeof(Book));
TextWriterwriter = new StreamWriter("booktest.xml");
BookObject.Title = "Praktisches 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 Hauptstraße";
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" binding="utf-8"?>
<Book xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance ">
<Title>Praktisches LotusScript</Title>
<AuthorObject>
<Vorname>Tony</Vorname>
<LastName>Patton</LastName>
<Geschlecht>Männlich</Geschlecht>
<AddressObject>
<Address1>1 Hauptstraße</Address1>
<Stadt>Überall</Stadt>
<State>KY</State>
<Zip>40000</Zip>
<Land>USA</Land>
</AddressObject>
</AuthorObject>
<ISBN>1884777767</ISBN>
<RetailPrice>43,95</RetailPrice>
<Herausgeber>Manning Publications</Herausgeber>
</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 Beispielcode, der in VB.NET geschrieben wurde:
Öffentliche Klassenadresse
Öffentliche Adresse1 als String
Öffentliche Adresse2 als String
Öffentliche Stadt als String
Öffentlicher Zustand als String
Öffentliche Postleitzahl als String
Öffentliches Land als String
Unterricht beenden
Autor der öffentlichen Klasse
Öffentlicher Vorname als String
Öffentlicher zweiter Vorname als String
Öffentlicher Nachname als String
Öffentlicher Titel als String
Öffentliches Geschlecht als String
Öffentliches Adressobjekt als Adresse
Unterricht beenden
Öffentliches Klassenbuch
Öffentliches AuthorObject als Autor
Öffentlicher Titel als String
Öffentliche ISBN als String
Öffentlicher Einzelhandelspreis als Double
Öffentlicher Herausgeber als String
Unterricht beenden
Importiert System.Xml.Serialization
ImportsSystem.IO
Modul Modul1
Sub Main()
BookObject als neues Buch dimmen
Dim ser As New XmlSerializer(GetType(Book))
Dim Writer als neuer StreamWriter("booktest.xml")
Mit BookObject
.Title = „Praktisches LotusScript“
.ISBN = "1884777767 "
.Publisher = „Manning Publications“
.RetailPrice = 43,95
.AuthorObject = Neuer Autor
.AuthorObject.FirstName = "Tony"
.AuthorObject.LastName = "Patton"
.AuthorObject.Gender = "Male"
.AuthorObject.AddressObject = Neue Adresse
.AuthorObject.AddressObject.Address1 = "1 Hauptstraße"
.AuthorObject.AddressObject.City = "Anywhere"
.AuthorObject.AddressObject.State = "KY"
.AuthorObject.AddressObject.Zip = "40000"
.AuthorObject.AddressObject.Country = "USA"
Ende mit
ser.Serialize(writer, BookObject)
Writer.Close()
Sub beenden
Steuerausgang
des Endmoduls
Der Serialisierungsprozess generiert Standard-XML-Dateien und Datenelemente werden in XML-Elemente konvertiert. 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.
Öffentliches Klassenbuch
Öffentliches AuthorObject als Autor
Öffentlicher Titel als String
<System.Xml.Serialization.XmlAttribute()> _
Öffentliche ISBN als String
<System.Xml.Serialization.XmlIgnoreAttribute()> _
Öffentlicher Einzelhandelspreis als Double
Öffentlicher Herausgeber als 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" binding="utf-8"?>
<Book xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " ISBN="1884777767 ">
<AuthorObject>
<Vorname>Tony</Vorname>
<LastName>Patton</LastName>
<Geschlecht>Männlich</Geschlecht>
<AddressObject>
<Address1>1 Hauptstraße</Address1>
<Stadt>Überall</Stadt>
<State>KY</State>
<Zip>40000</Zip>
<Land>USA</Land>
</AddressObject>
</AuthorObject>
<Title>Praktisches LotusScript</Title>
<Herausgeber>Manning Publications</Herausgeber>
</Book>
Das Folgende ist der entsprechende C#-Code:
public class Book {
öffentliches Buch() { }
öffentlicher String-Titel;
öffentlicher Autor AuthorObject;
[System.Xml.Serialization.XmlAttribute()]
öffentliche Zeichenfolge ISBN;
[System.Xml.Serialization.XmlIgnoreAttribute()]
öffentlicher doppelter Einzelhandelspreis;
öffentlicher String-Herausgeber;
}
Oben werden nur kurz zwei Markierungssymbole erwähnt. Die vollständige Markup-Notation finden Sie in der .NET-Dokumentation.
Das Deserialisieren deserialisierter Daten kann einfach durch Aufrufen der Deserialize-Methode der XmlSerializer-Klasse erreicht werden. Das folgende VB.NET-Programmfragment schließt die Deserialisierung des oben erwähnten XML-Dokuments ab:
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 als neues System.XML.XmlTextReader(fs)
BookObject = CType(ser.Deserialize(reader), Book)
Dieses Programm legt die Ergebnisdaten zur späteren Verwendung im Speicher ab. Hier ist der entsprechende C#-Code:
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);
Buch BookObject = (Book)(ser.Deserialize(reader));
-------------------------------------------------- -
Über den Autor: Tony Patton ist ein professioneller Anwendungsentwickler mit umfangreichen Kenntnissen und zertifiziert in Java, VB, Lotus und XML.