Freigeben über


XML-Serialisierung

Serialisierung ist der Prozess der Umwandlung eines Objekts in eine Form, die leicht transportiert werden kann. Sie können z. B. ein Objekt serialisieren und über das Internet mithilfe von HTTP zwischen einem Client und einem Server übertragen. Am anderen Ende rekonstruiert die Deserialisierung das Objekt aus dem Datenstrom.

Die XML-Serialisierung serialisiert nur die öffentlichen Felder und Eigenschaftswerte eines Objekts in einem XML-Datenstrom. Die XML-Serialisierung enthält keine Typinformationen. Wenn Sie z. B. über ein Book-Objekt verfügen, das im Library Namespace vorhanden ist, besteht keine Garantie dafür, dass es in ein Objekt vom selben Typ deserialisiert wird.

Hinweis

Methoden, Indexer, private Felder und schreibgeschützte Eigenschaften(ausgenommen schreibgeschützte Auflistungen) werden bei der XML-Serialisierung nicht konvertiert. Verwenden Sie zum Serialisieren aller Felder und Eigenschaften eines Objekts sowohl öffentlich als auch privat die DataContractSerializer Anstelle der XML-Serialisierung.

Die zentrale Klasse in der XML-Serialisierung ist die XmlSerializer Klasse, und die wichtigsten Methoden in dieser Klasse sind die Serialize - und Deserialize-Methoden . Die XmlSerializer erstellt C#-Dateien und kompiliert sie in .dll-Dateien, um diese Serialisierung durchzuführen. Das XML Serializer Generator Tool (Sgen.exe) ist dazu ausgelegt, diese Serialisierungsassemblys im Voraus zu generieren, damit sie mit Ihrer Anwendung bereitgestellt werden können und die Startleistung verbessert wird. Der vom XmlSerializer generierte XML-Datenstrom entspricht der Empfehlung "World Wide Web Consortium (W3C) -XML-Schemadefinitionssprache (XSD) 1.0". Darüber hinaus entsprechen die generierten Datentypen dem Dokument mit dem Titel "XML Schema Part 2: Datatypes".

Die Daten in Ihren Objekten werden mithilfe von Programmiersprachenkonstrukten wie Klassen, Feldern, Eigenschaften, Grundtypen, Arrays und sogar eingebetteten XML in Form von XmlElement- oder XmlAttribute-Objekten beschrieben. Sie haben die Möglichkeit, eigene Klassen zu erstellen, mit Attributen versehen oder das XML-Schemadefinitionstool zu verwenden, um die Klassen basierend auf einem vorhandenen XML-Schema zu generieren.

Wenn Sie über ein XML-Schema verfügen, können Sie das XML-Schemadefinitionstool ausführen, um eine Reihe von Klassen zu erstellen, die stark in das Schema eingegeben und mit Attributen versehen sind. Wenn eine Instanz einer solchen Klasse serialisiert wird, entspricht die generierte XML dem XML-Schema. Mit einer solchen Klasse können Sie mithilfe eines leicht bearbeiteten Objektmodells programmieren und gleichzeitig sicher sein, dass der generierte XML-Code dem XML-Schema entspricht. Dies ist eine Alternative zur Verwendung anderer Klassen in .NET, z. B. xmlReader - und XmlWriter-Klassen , um einen XML-Datenstrom zu analysieren und zu schreiben. Weitere Informationen finden Sie unter XML-Dokumente und -Daten. Mit diesen Klassen können Sie einen beliebigen XML-Datenstrom analysieren. Verwenden Sie im Gegensatz dazu den XmlSerializer , wenn der XML-Stream einem bekannten XML-Schema entspricht.

Attribute steuern den von der XmlSerializer-Klasse generierten XML-Datenstrom, sodass Sie den XML-Namespace, den Elementnamen, den Attributnamen usw. des XML-Datenstroms festlegen können. Weitere Informationen zu diesen Attributen und deren Steuerung der XML-Serialisierung finden Sie unter Steuern der XML-Serialisierung mithilfe von Attributen. Eine Tabelle mit diesen Attributen, die zum Steuern des generierten XML-Codes verwendet werden, finden Sie unter Attributes That Control XML Serialization.

Die XmlSerializer-Klasse kann ein Objekt weiter serialisieren und einen codierten SOAP-XML-Stream generieren. Die generierte XML entspricht Abschnitt 5 des World Wide Web Consortium-Dokuments mit dem Titel "Simple Object Access Protocol (SOAP) 1.1". Weitere Informationen zu diesem Prozess finden Sie unter How to: Serialize an Object as a SOAP-Encoded XML Stream. Eine Tabelle mit den Attributen, die den generierten XML-Code steuern, finden Sie unter Attribute That Control Encoded SOAP Serialization.

Die XmlSerializer-Klasse generiert die SOAP-Nachrichten, die von XML-Webdiensten erstellt und an diese übergeben werden. Um die SOAP-Nachrichten zu steuern, können Sie Attribute auf die Klassen, Rückgabewerte, Parameter und Felder anwenden, die in einer XML-Webdienstdatei (ASMX) enthalten sind. Sie können sowohl die attribute verwenden, die unter "Attributes That Control XML Serialization" als auch "Attributes That Control Encoded SOAP Serialization" aufgeführt sind, da ein XML-Webdienst entweder die Literal- oder codierte SOAP-Formatvorlage verwenden kann. Weitere Informationen zur Verwendung von Attributen zum Steuern des von einem XML-Webdienst generierten XML-Webdiensts finden Sie unter XML-Serialisierung mit XML-Webdiensten. Weitere Informationen zu SOAP- und XML-Webdiensten finden Sie unter Anpassen der SOAP-Nachrichtenformatierung.

Sicherheitsüberlegungen für XmlSerializer-Anwendungen

Beachten Sie beim Erstellen einer Anwendung, die den XmlSerializer verwendet, die folgenden Elemente und deren Auswirkungen:

  • Der XmlSerializer erstellt C#-Dateien (.cs) und kompiliert sie in .dll Dateien im Verzeichnis, das von der TEMP-Umgebungsvariablen benannt wird; Serialisierung erfolgt mit diesen DLLs.

    Hinweis

    Diese Serialisierungsassemblys können im Voraus generiert und mithilfe des Tools SGen.exe signiert werden. Dies funktioniert nicht auf einem Server von Webdiensten. Mit anderen Worten, es ist nur für die Clientverwendung und für die manuelle Serialisierung vorgesehen.

    Der Code und die DLLs sind zum Zeitpunkt der Erstellung und Kompilierung anfällig für einen bösartigen Prozess. Es kann sein, dass zwei oder mehr Benutzer das TEMP-Verzeichnis freigeben können. Das Freigeben eines TEMP-Verzeichnisses ist gefährlich, wenn die beiden Konten unterschiedliche Sicherheitsberechtigungen besitzen und das Konto mit höheren Berechtigungen eine Anwendung mit dem XmlSerializer ausführt. In diesem Fall kann ein Benutzer die Sicherheit des Computers verletzen, indem er entweder die kompilierte .cs oder .dll Datei ersetzt. Um dieses Problem zu beseitigen, achten Sie immer darauf, dass jedes Konto auf dem Computer über ein eigenes Profil verfügt. Standardmäßig verweist die TEMP-Umgebungsvariable auf ein anderes Verzeichnis für jedes Konto.

  • Wenn ein böswilliger Benutzer einen kontinuierlichen XML-Datenstrom an einen Webserver (einen Denial of Service-Angriff) sendet, verarbeitet der XmlSerializer die Daten weiterhin, bis der Computer wenig Ressourcen verwendet.

    Diese Art von Angriff wird beseitigt, wenn Sie einen Computer verwenden, auf dem Internetinformationsdienste (Internet Information Services, IIS) ausgeführt wird, und Ihre Anwendung wird in IIS ausgeführt. IIS verfügt über ein Gate, das Datenströme nicht länger als einen festgelegten Betrag verarbeitet (der Standardwert ist 4 KB). Wenn Sie eine Anwendung erstellen, die IIS nicht verwendet und mit dem XmlSerializer deserialisiert, sollten Sie ein ähnliches Gate implementieren, das einen Denial-of-Service-Angriff verhindert.

  • Der XmlSerializer serialisiert Daten und führt jeglichen Code unter Verwendung aller ihm gegebenen Typen aus.

    Es gibt zwei Möglichkeiten, wie ein böswilliges Objekt eine Bedrohung darstellt. Es könnte bösartigen Code ausführen oder schädlichen Code in die C#-Datei einfügen, die vom XmlSerializer erstellt wurde. Im zweiten Fall besteht eine theoretische Möglichkeit, dass ein schädliches Objekt irgendwie Code in die C#-Datei eingibt, die vom XmlSerializer erstellt wurde. Obwohl dieses Problem gründlich untersucht wurde und ein solcher Angriff als unwahrscheinlich gilt, sollten Sie die Vorsichtsmaßnahme ergreifen, Daten niemals mit einem unbekannten und nicht vertrauenswürdigen Typ zu serialisieren.

  • Serialisierte vertrauliche Daten sind möglicherweise anfällig.

    Nachdem der XmlSerializer serialisierte Daten aufweist, kann er als XML-Datei oder als anderer Datenspeicher gespeichert werden. Wenn Ihr Datenspeicher für andere Prozesse verfügbar ist oder in einem Intranet oder im Internet sichtbar ist, können die Daten gestohlen und böswillig verwendet werden. Wenn Sie beispielsweise eine Anwendung erstellen, die Bestellungen serialisiert, die Kreditkartennummern enthalten, sind die Daten streng vertraulich. Um dies zu verhindern, schützen Sie den Speicher immer für Ihre Daten und ergreifen Sie Schritte, um sie privat zu halten.

Serialisierung einer einfachen Klasse

Das folgende Codebeispiel zeigt eine einfache Klasse mit einem öffentlichen Feld.

Public Class OrderForm
    Public OrderDate As DateTime
End Class
public class OrderForm
{
    public DateTime OrderDate;
}

Wenn eine Instanz dieser Klasse serialisiert wird, kann sie wie folgt aussehen.

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

Weitere Beispiele für die Serialisierung finden Sie unter Beispiele für die XML-Serialisierung.

Elemente, die serialisiert werden können

Die folgenden Elemente können mithilfe der XmlSerializer-Klasse serialisiert werden:

  • Öffentliche Eigenschaften mit Lese-/Schreibzugriff und Felder von öffentlichen Klassen

  • Klassen, die ICollection oder IEnumerable implementieren.

    Hinweis

    Nur Auflistungen werden serialisiert, öffentliche Eigenschaften nicht

  • XmlElement-Objekte .

  • XmlNode-Objekte .

  • DataSet-Objekte .

Weitere Informationen zum Serialisieren oder Deserialisieren von Objekten finden Sie unter How to: Serialize an Object and How to: Deserialize an Object.

Vorteile der Verwendung der XML-Serialisierung

Die XmlSerializer-Klasse bietet Ihnen vollständige und flexible Steuerung, wenn Sie ein Objekt als XML serialisieren. Wenn Sie einen XML-Webdienst erstellen, können Sie Attribute, die die Serialisierung steuern, auf Klassen und deren Mitglieder anwenden, um sicherzustellen, dass die XML-Ausgabe einem bestimmten Schema entspricht.

Mit XmlSerializer können Sie z. B. folgende Aktionen ausführen:

  • Geben Sie an, ob ein Feld oder eine Eigenschaft als Attribut oder element codiert werden soll.

  • Geben Sie einen zu verwendenden XML-Namespace an.

  • Geben Sie den Namen eines Elements oder Attributs an, wenn ein Feld- oder Eigenschaftenname ungeeignet ist.

Ein weiterer Vorteil der XML-Serialisierung besteht darin, dass Sie keine Einschränkungen für die anwendungen haben, die Sie entwickeln, solange der generierte XML-Datenstrom einem bestimmten Schema entspricht. Stellen Sie sich ein Schema vor, das zum Beschreiben von Büchern verwendet wird. Es enthält ein Titel-, Autoren-, Herausgeber- und ISBN-Nummernelement. Sie können eine Anwendung entwickeln, die die XML-Daten auf beliebige Weise verarbeitet, z. B. als Buchauftrag oder als Bestand von Büchern. In beiden Fällen ist die einzige Anforderung, dass der XML-Datenstrom dem angegebenen XSD-Schema (XML Schema Definition Language) entspricht.

Überlegungen zur XML-Serialisierung

Folgendes sollte bei Verwendung der XmlSerializer-Klasse berücksichtigt werden:

  • Das Sgen.exe Tool ist ausdrücklich darauf ausgelegt, Serialisierungsbaugruppen für eine optimale Leistung zu erstellen.

  • Die serialisierten Daten enthalten nur die Daten selbst und die Struktur Ihrer Klassen. Typidentitäts- und Assemblyinformationen sind nicht enthalten.

  • Nur öffentliche Eigenschaften und Felder können serialisiert werden. Eigenschaften müssen über öffentliche Accessoren (get- und set-Methoden) verfügen. Wenn Sie nicht öffentliche Daten serialisieren müssen, verwenden Sie die Klasse anstelle der DataContractSerializer XML-Serialisierung.

  • Eine Klasse muss über einen parameterlosen Konstruktor verfügen, der von XmlSerializer serialisiert werden soll.

  • Methoden können nicht serialisiert werden.

  • XmlSerializer kann Klassen verarbeiten, die IEnumerable oder ICollection anders implementieren, wenn sie bestimmte Anforderungen erfüllen, wie folgt.

    Eine Klasse, die IEnumerable implementiert, muss eine öffentliche Add-Methode implementieren, die einen einzelnen Parameter verwendet. Der Parameter der Add-Methode muss konsistent (polymorph) mit dem Typ sein, der von der IEnumerator.Current-Eigenschaft aus der GetEnumerator-Methode zurückgegeben wird.

    Eine Klasse, die zusätzlich zu IEnumerable (z. B. CollectionBase) IEnumerable implementiert, muss über eine öffentliche Elementindizierungseigenschaft (ein Indexer in C#) verfügen, der eine ganze Zahl akzeptiert und eine öffentliche Count-Eigenschaft vom Typ "integer" aufweisen muss. Der an die Add-Methode übergebene Parameter muss den gleichen Typ wie der von der Item-Eigenschaft oder einer der Basis dieses Typs zurückgegebenen sein.

    Für Klassen, die ICollection implementieren, werden zu serialisierende Werte nicht durch Aufrufen von GetEnumerator, sondern aus der indizierten Item-Eigenschaft abgerufen. Außerdem werden öffentliche Felder und Eigenschaften nicht serialisiert, mit Ausnahme öffentlicher Felder, die eine andere Sammlungsklasse zurückgeben (eine, die ICollection implementiert). Ein Beispiel finden Sie unter Beispiele für die XML-Serialisierung.

XSD-Datentypzuordnung

Das W3C-Dokument mit dem Titel XML-SchemaTeil 2: Datentypen gibt die einfachen Datentypen an, die in einem XSD-Schema (XML Schema Definition Language) zulässig sind. Für viele dieser Elemente (z. B. "Int " und "dezimal") gibt es einen entsprechenden Datentyp in .NET. Einige XML-Datentypen weisen jedoch keinen entsprechenden .NET-Datentyp auf, z. B. den NMTOKEN-Datentyp . Wenn Sie in solchen Fällen das XML-Schemadefinitionstool (XML Schema Definition Tool (Xsd.exe)) verwenden, um Klassen aus einem Schema zu generieren, wird ein geeignetes Attribut auf ein Element vom Typ Zeichenfolge angewendet, und die DataType-Eigenschaft wird auf den NAMEN des XML-Datentyps festgelegt. Wenn beispielsweise ein Schema ein Element namens "MyToken" mit dem XML-Datentyp NMTOKEN enthält, kann die generierte Klasse ein Element enthalten, wie im folgenden Beispiel gezeigt.

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

Ebenso sollten Sie beim Erstellen einer Klasse, die einem bestimmten XML-Schema (XSD) entsprechen muss, das entsprechende Attribut anwenden und dessen DataType-Eigenschaft auf den gewünschten XML-Datentypnamen festlegen.

Eine vollständige Liste der Typzuordnungen finden Sie in der DataType-Eigenschaft für eine der folgenden Attributklassen:

Siehe auch