Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.
Die XML-Serialisierung ist der Prozess der Konvertierung der öffentlichen Eigenschaften und Felder eines Objekts in ein serielles Format (in diesem Fall XML) für Speicher oder Transport. Die Deserialisierung erstellt das Objekt in seinem ursprünglichen Zustand aus der XML-Ausgabe neu. Sie können sich die Serialisierung als Möglichkeit vorstellen, den Zustand eines Objekts in einem Datenstrom oder Puffer zu speichern. Beispielsweise verwendet ASP.NET die XmlSerializer Klasse zum Codieren von XML-Webdienstnachrichten.
Die Daten in Ihren Objekten werden mithilfe von Programmiersprachenkonstrukten wie Klassen, Feldern, Eigenschaften, Grundtypen, Arrays und sogar eingebettetem XML in der Form von XmlElement oder XmlAttribute Objekten beschrieben. Sie haben die Möglichkeit, eigene Klassen zu erstellen, mit Attributen versehen oder das XML-Schemadefinitionstool (Xsd.exe) zu verwenden, um die Klassen basierend auf einem vorhandenen XSD-Dokument (XML Schema Definition) zu generieren. Wenn Sie über ein XML-Schema verfügen, können Sie die Xsd.exe ausführen, um eine Reihe von Klassen zu erstellen, die stark in das Schema eingegeben sind, und mit Attributen versehen werden, die beim Serialisieren dem Schema entsprechen sollen.
Zum Übertragen von Daten zwischen Objekten und XML ist eine Zuordnung aus den Programmiersprachenkonstrukten zum XML-Schema und vom XML-Schema bis zu den Programmiersprache-Konstrukten erforderlich. Die XmlSerializer und verwandte Werkzeuge wie Xsd.exe bilden sowohl zur Entwurfszeit als auch zur Laufzeit die Brücke zwischen diesen beiden Technologien. Verwenden Sie zur Entwurfszeit die Xsd.exe, um ein XML-Schemadokument (XSD) aus Ihren benutzerdefinierten Klassen zu erstellen oder Klassen aus einem bestimmten Schema zu erstellen. In beiden Fällen werden die Klassen mit benutzerdefinierten Attributen versehen, um die XmlSerializer anzuweisen, wie die Zuordnung zwischen dem XML-Schemasystem und der Common Language Runtime erfolgen soll. Zur Laufzeit können Instanzen der Klassen in XML-Dokumente serialisiert werden, die dem angegebenen Schema folgen. Ebenso können diese XML-Dokumente in Laufzeitobjekte deserialisiert werden. Beachten Sie, dass das XML-Schema optional ist und zur Entwurfszeit oder Laufzeit nicht erforderlich ist.
Generiertes XML kontrollieren
Um das generierte XML zu steuern, können Sie spezielle Attribute auf Klassen und Member anwenden. Wenn Sie beispielsweise einen anderen XML-Elementnamen angeben möchten, wenden Sie einen XmlElementAttribute auf ein öffentliches Feld oder eine Eigenschaft an, und legen Sie die ElementName Eigenschaft fest. Eine vollständige Liste ähnlicher Attribute finden Sie unter Attributes That Control XML Serialization. Sie können die IXmlSerializable Schnittstelle auch implementieren, um die XML-Ausgabe zu steuern.
Wenn der generierte XML-Code Abschnitt 5 des Dokuments vom World Wide Web Consortium, Simple Object Access Protocol (SOAP) 1.1, entsprechen muss, müssen Sie das XmlSerializer mit einem XmlTypeMapping erstellen. Um den codierten SOAP-XML-Code weiter zu steuern, verwenden Sie die Attribute, die in Attributen aufgeführt sind, die die SOAP-Serialisierung steuern.
Mit der Nutzung von XmlSerializer können Sie sowohl die Arbeit mit stark typisierten Klassen genießen als auch die Flexibilität von XML beibehalten. Mithilfe von Feldern oder Eigenschaften des Typs XmlElementXmlAttribute oder XmlNode in ihren stark typierten Klassen können Sie Teile des XML-Dokuments direkt in XML-Objekte lesen.
Wenn Sie mit erweiterbaren XML-Schemas arbeiten, können Sie auch die Attribute XmlAnyElementAttribute und XmlAnyAttributeAttribute verwenden, um Elemente oder Attribute zu serialisieren und zu deserialisieren, die im ursprünglichen Schema nicht vorhanden sind. Um die Objekte zu verwenden, wenden Sie ein XmlAnyElementAttribute Feld an, das ein Array von XmlElement Objekten zurückgibt, oder wenden Sie ein XmlAnyAttributeAttribute Feld an, das ein Array von XmlAttribute Objekten zurückgibt.
Wenn eine Eigenschaft oder ein Feld ein komplexes Objekt (z. B. ein Array oder eine Klasseninstanz) zurückgibt, XmlSerializer wird es in ein element konvertiert, das im XML-Hauptdokument geschachtelt ist. Die erste Klasse im folgenden Code gibt beispielsweise eine Instanz der zweiten Klasse zurück.
Public Class MyClass
Public MyObjectProperty As MyObject
End Class
Public Class MyObject
Public ObjectName As String
End Class
public class MyClass
{
public MyObject MyObjectProperty;
}
public class MyObject
{
public string ObjectName;
}
Die serialisierte XML-Ausgabe sieht wie folgt aus:
<MyClass>
<MyObjectProperty>
<ObjectName>My String</ObjectName>
</MyObjectProperty>
</MyClass>
Wenn ein Schema ein optionales Element enthält (minOccurs = '0'), oder wenn das Schema einen Standardwert enthält, haben Sie zwei Optionen. Eine Option besteht darin, den Standardwert mit System.ComponentModel.DefaultValueAttribute anzugeben, wie im folgenden Code dargestellt.
Public Class PurchaseOrder
<System.ComponentModel.DefaultValueAttribute ("2002")> _
Public Year As String
End Class
public class PurchaseOrder
{
[System.ComponentModel.DefaultValueAttribute ("2002")]
public string Year;
}
Eine weitere Option besteht darin, ein spezielles Muster zu verwenden, um ein boolesches Feld zu erstellen, das von XmlSerializer erkannt wird, und XmlIgnoreAttribute auf das Feld anzuwenden. Das Muster wird in der Form von propertyNameSpecified
erstellt. Wenn beispielsweise ein Feld mit dem Namen "MyFirstName" vorhanden ist, erstellen Sie auch ein Feld mit dem Namen "MyFirstNameSpecified", das anweist XmlSerializer , ob das XML-Element namens "MyFirstName" generiert werden soll. Dies wird im folgenden Beispiel gezeigt.
Public Class OptionalOrder
' This field's value should not be serialized
' if it is uninitialized.
Public FirstOrder As String
' Use the XmlIgnoreAttribute to ignore the
' special field named "FirstOrderSpecified".
<System.Xml.Serialization.XmlIgnoreAttribute> _
Public FirstOrderSpecified As Boolean
End Class
public class OptionalOrder
{
// This field should not be serialized
// if it is uninitialized.
public string FirstOrder;
// Use the XmlIgnoreAttribute to ignore the
// special field named "FirstOrderSpecified".
[System.Xml.Serialization.XmlIgnoreAttribute]
public bool FirstOrderSpecified;
}
Außerkraftsetzen der Standard serialisierung
Sie können auch die Serialisierung jeder Gruppe von Objekten und deren Felder und Eigenschaften außer Kraft setzen, indem Sie eines der entsprechenden Attribute erstellen und einer Instanz der XmlAttributes Klasse hinzufügen. Das Überschreiben der Serialisierung auf diese Weise hat zwei Verwendungsmöglichkeiten: Erstens können Sie die Serialisierung von Objekten in einer DLL steuern und erweitern, auch wenn Sie keinen Zugriff auf die Quelle haben; Zweitens können Sie einen Satz serialisierbarer Klassen erstellen, aber die Objekte auf mehrere Arten serialisieren. Weitere Informationen finden Sie in der XmlAttributeOverrides Klasse und vorgehensweise: Steuern der Serialisierung abgeleiteter Klassen.
Rufen Sie die Serialize Methode auf, um ein Objekt zu serialisieren. Zum Deserialisieren eines Objekts rufen Sie die Deserialize Methode auf.
Informationen zum Hinzufügen von XML-Namespaces zu einem XML-Dokument finden Sie unter XmlSerializerNamespaces.
Hinweis
Die XmlSerializer behandelt Klassen, die IEnumerable oder ICollection implementieren, besonders. Eine Klasse, die IEnumerable implementiert, muss eine öffentliche Methode Add
implementieren, die einen einzelnen Parameter entgegennimmt. Der Parameter der Add
-Methode muss denselben Typ aufweisen, der von der Current
-Eigenschaft für den von GetEnumerator
zurückgegebenen Wert oder einer der Basiswerte dieses Typs zurückgegeben wird. Eine Klasse, die ICollection (wie CollectionBase) zusätzlich zu IEnumerable implementiert, muss eine öffentliche Item
indizierte Eigenschaft (Indexer in C#) haben, die eine ganze Zahl akzeptiert, und sie muss eine öffentliche Count
Eigenschaft vom Typ Integer aufweisen. Der Parameter für die Add
Methode muss derselbe Typ sein, der von der Item
Eigenschaft oder einer der Basen dieses Typs zurückgegeben wird. Für Klassen, die ICollection implementieren, werden zu serialisierende Werte aus der indizierten Item
-Eigenschaft abgerufen, anstatt GetEnumerator
aufzurufen.
Sie müssen über die Berechtigung zum Schreiben in das temporäre Verzeichnis (gemäß Definition durch die TEMP-Umgebungsvariable) verfügen, um ein Objekt zu deserialisieren.
Dynamisch generierte Baugruppen
Um die Leistung zu erhöhen, generiert die XML-Serialisierungsinfrastruktur dynamisch Assemblys zum Serialisieren und Deserialisieren der angegebenen Typen. Die Infrastruktur findet und wiederverwendet diese Baugruppen. Dieses Verhalten tritt nur bei Verwendung der folgenden Konstruktoren auf:
XmlSerializer.XmlSerializer(Type)
XmlSerializer.XmlSerializer(Type, String)
Wenn Sie einen der anderen Konstruktoren verwenden, werden mehrere Versionen derselben Assembly generiert und nie entladen, was zu einem Speicherverlust und einer schlechten Leistung führt. Die einfachste Lösung besteht darin, einen der zuvor erwähnten beiden Konstruktoren zu verwenden. Andernfalls müssen Sie die Assemblys in einem Hashtable, wie im folgenden Beispiel gezeigt, zwischenspeichern.
Hashtable serializers = new Hashtable();
// Use the constructor that takes a type and XmlRootAttribute.
XmlSerializer s = new XmlSerializer(typeof(MyClass), myRoot);
// Implement a method named GenerateKey that creates unique keys
// for each instance of the XmlSerializer. The code should take
// into account all parameters passed to the XmlSerializer
// constructor.
object key = GenerateKey(typeof(MyClass), myRoot);
// Check the local cache for a matching serializer.
XmlSerializer ser = (XmlSerializer)serializers[key];
if (ser == null)
{
ser = new XmlSerializer(typeof(MyClass), myRoot);
// Cache the serializer.
serializers[key] = ser;
}
// Use the serializer to serialize or deserialize.
Dim serializers As New Hashtable()
' Use the constructor that takes a type and XmlRootAttribute.
Dim s As New XmlSerializer(GetType([MyClass]), myRoot)
' Implement a method named GenerateKey that creates unique keys
' for each instance of the XmlSerializer. The code should take
' into account all parameters passed to the XmlSerializer
' constructor.
Dim key As Object = GenerateKey(GetType([MyClass]), myRoot)
' Check the local cache for a matching serializer.
Dim ser As XmlSerializer = CType(serializers(key), XmlSerializer)
If ser Is Nothing Then
ser = New XmlSerializer(GetType([MyClass]), myRoot)
' Cache the serializer.
serializers(key) = ser
End If
' Use the serializer to serialize or deserialize.
Serialisierung von ArrayList und generischer Liste
Das XmlSerializer kann Folgendes nicht serialisieren oder deserialisieren:
Serialisierung von Enumerationen von „unsigned long“
XmlSerializer kann nicht zum Serialisieren einer Enumeration instanziiert werden, wenn die folgenden Bedingungen zutreffen: Die Enumeration ist vom Typ „unsigned long“ (ulong
in C#), und die Enumeration enthält ein Member mit einem Wert, der größer als 9.223.372.036.854.775.807 ist. Beispielsweise kann Folgendes nicht serialisiert werden.
public enum LargeNumbers: ulong
{
a = 9223372036854775808
}
// At run time, the following code will fail.
xmlSerializer mySerializer=new XmlSerializer(typeof(LargeNumbers));
Veraltete Typen
Die XmlSerializer Klasse serialisiert keine Objekte, die als [Obsolete]
gekennzeichnet sind.