Freigeben über


Verwenden der XmlSerializer-Klasse

Windows Communication Foundation (WCF) kann zwei verschiedene Serialisierungstechnologien verwenden, um die Daten in der Anwendung in XML für die Übertragung zwischen Clients und Diensten umzuwandeln; dieser Vorgang wird als Serialisierung bezeichnet.

DataContractSerializer als Standard

Standardmäßig verwendet WCF die DataContractSerializer-Klasse, um Datentypen zu serialisieren. Dieses Serialisierungsprogramm unterstützt die folgenden Typen:

  • Primitive Typen (z. B. ganze Zahlen, Zeichenfolgen und Bytearrays) sowie einige spezielle Typen wie XmlElement und DateTime, die als Primitive behandelt werden.
  • Datenvertragstypen (mit dem DataContractAttribute-Attribut markierte Typen).
  • Mit dem SerializableAttribute-Attribut markierte Typen, einschließlich Typen, die die ISerializable-Schnittstelle implementieren.
  • Typen, die die IXmlSerializable-Schnittstelle implementieren.
  • Viele allgemeine Auflistungstypen, einschließlich vieler generischer Auflistungstypen.

Viele .NET Framework-Typen fallen in die letzten beiden Kategorien und sind daher serialisierbar. Arrays serialisierbarer Typen sind ebenfalls serialisierbar. Eine vollständige Liste finden Sie unter Angeben von Datenübertragung in Dienstverträgen.

Das DataContractSerializer, zusammen mit Datenvertragstypen verwendet, ist die empfohlene Methode, um neue WCF-Dienste zu schreiben. Weitere Informationen finden Sie unter Verwenden von Datenverträgen.

Verwendung der XmlSerializer-Klasse

WCF unterstützt auch die XmlSerializer-Klasse. Die XmlSerializer-Klasse ist nicht exklusiv in WCF verfügbar. Vielmehr handelt es sich hierbei um das gleiche Serialisierungsmodul, das auch von den ASP.NET-Webdiensten verwendet wird. Die XmlSerializer-Klasse unterstützt deutlich weniger Typen als die DataContractSerializer-Klasse, ermöglicht jedoch eine größere Kontrolle über das resultierende XML und unterstützt den XSD-Schemastandard (XML Schema definition language) stärker. Sie erfordert außerdem keine deklarativen Attribute für die serialisierbaren Typen. Weitere Informationen finden Sie unter dem Thema zur XML-Serialisierung in der .NET Framework-Dokumentation. Die XmlSerializer-Klasse unterstützt keine Datenvertragstypen.

Beim Verwenden von Svcutil.exe oder dem Feature zum Hinzufügen des Dienstverweises in Visual Studio zum Generieren von Clientcode für einen Dienst eines Drittanbieters oder zum Zugriff auf ein Schema eines Drittanbieters wird automatisch ein geeignetes Serialisierungsprogramm für Sie ausgewählt. Wenn das Schema nicht mit DataContractSerializer kompatibel ist, wird XmlSerializer ausgewählt.

Manuelles Wechseln zu XmlSerializer

Es kann vorkommen, dass Sie manuell zu XmlSerializer wechseln müssen. Dies ist beispielsweise in den folgenden Situationen der Fall:

  • Beim Migrieren einer Anwendung von ASP.NET-Webdiensten zu WCF kann es sinnvoll sein, vorhandene XmlSerializer-kompatible Typen erneut zu verwenden, anstatt neue Datenvertragstypen zu erstellen.
  • Wenn die präzise Steuerung von in Nachrichten enthaltenen XML-Daten wichtig ist, jedoch kein WSDL (Web Services Description Language)-Dokument zur Verfügung steht, z. B. beim Erstellen eines Dienstes mit Typen, die einem bestimmten standardisierten, veröffentlichten Schema entsprechen müssen, das nicht mit dem DataContractSerializer kompatibel ist.
  • Beim Erstellen von Diensten, die dem älteren SOAP-Codierungsstandard folgen.

In diesen und anderen Fällen können Sie manuell zur XmlSerializer-Klasse wechseln, indem Sie das XmlSerializerFormatAttribute-Attribut auf den Dienst anwenden, wie im folgenden Code dargestellt.

Sicherheitsüberlegungen

Tipp

Beim Wechseln von Serialisierungsmodulen ist große Sorgfalt geboten. Derselbe Typ kann je nach verwendetem Serialisierungsprogramm mehrere Serialisierungskonzepte umfassen. Wenn Sie versehentlich das falsche Serialisierungsprogramm verwenden, legen Sie möglicherweise Informationen aus dem Typ offen, deren Offenlegung Sie nicht beabsichtigt haben.

Beispielsweise serialisiert die DataContractSerializer-Klasse beim Serialisieren von Datenvertragstypen nur mit dem DataMemberAttribute-Attribut markierte Member. Die XmlSerializer-Klasse serialisiert jeden öffentlichen Member. Beachten Sie den Typ im folgenden Code:

Wenn der Typ versehentlich in einem Dienstvertrag verwendet wird, in dem die XmlSerializer-Klasse ausgewählt ist, wird der creditCardNumber-Member serialisiert, was wahrscheinlich nicht beabsichtigt ist.

Auch wenn die DataContractSerializer-Klasse der Standard ist, können Sie sie explizit für Ihren Dienst auswählen (obwohl dies nie erforderlich sein sollte), indem Sie das DataContractFormatAttribute-Attribut auf den Dienstvertragstyp anwenden.

Das für den Dienst verwendete Serialisierungsprogramm ist ein wesentlicher Bestandteil des Vertrags und kann durch Auswahl einer anderen Bindung oder durch Ändern anderer Konfigurationseinstellungen nicht geändert werden.

Andere wichtige Sicherheitsüberlegungen gelten für die XmlSerializer-Klasse. Es wird zuerst dringend empfohlen, dass jede WCF-Anwendung, die die XmlSerializer-Klasse verwendet, mit einem vor Offenlegung geschützten Schlüssel signiert ist. Diese Empfehlung gilt sowohl für das manuelle Wechseln zu XmlSerializer als auch ein automatisches Wechseln (mit Svcutil.exe, "Dienstverweis hinzufügen" oder ein ähnliches Tool). Der Grund ist, dass das XmlSerializer-Serialisierungsmodul das Laden von vorgenerierten Serialisierungsassemblys unterstützt, wenn sie mit dem gleichen Schlüssel wie die Anwendung signiert sind. Eine nicht signierte Anwendung ist vollständig ungeschützt gegen die Möglichkeit, dass eine bösartige Assembly, die mit dem erwarteten Namen der vorgenerierten Serialisierungsassembly übereinstimmt, im Anwendungsordner oder im globalen Assemblycache platziert wird. Natürlich muss ein Angreifer zuerst Schreibzugriff auf einen der beiden Speicherorte erhalten, um diese Aktion auszuführen.

Eine weitere Bedrohung, die beim Verwenden von XmlSerializer vorhanden ist, hängt mit dem Schreibzugriff auf den temporären Ordners des Systems zusammen. Das XmlSerializer-Serialisierungsmodul erstellt und verwendet temporäre Serialisierungsassemblys in diesem Ordner. Sie sollten sich der Tatsache bewusst sein, dass jeder Vorgang mit Schreibzugriff auf den temporären Ordner diese Serialisierungsassemblys mit bösartigem Code überschreiben kann.

Regeln für XmlSerializer-Unterstützung

Sie können mit XmlSerializer kompatible Attribute nicht direkt auf Vertragsvorgangsparameter oder Rückgabewerte anwenden. Sie können jedoch auf typisierte Nachrichten (Nachrichtenvertragstextteile) angewendet werden, wie der folgende Code zeigt:

Beim Anwenden auf typisierte Nachrichtenmember überschreiben diese Attribute Eigenschaften, die mit den typisierten Nachrichtenattributen in Konflikt stehen. Beispielsweise wird im folgenden Code Name durch ElementName überschrieben.

Das MessageHeaderArrayAttribute-Attribut wird nicht unterstützt, wenn XmlSerializer verwendet wird.

Tipp

In diesem Fall löst XmlSerializer die folgende Ausnahme aus, die vor WCF freigegeben wird: "Für ein auf oberster Schemaebene deklariertes Element darf nicht maxOccurs > 1 gelten. Geben Sie ein Wrapperelement für 'more' an, indem Sie XmlElementAttribute nicht verwenden (verwenden Sie XmlArray und/oder XmlArrayItem), oder indem Sie den Wrapped-Parameterstil verwenden."

Wenn Sie eine solche Ausnahme empfangen, prüfen Sie, ob diese Situation zutrifft.

WCF unterstützt das SoapIncludeAttribute- und das XmlIncludeAttribute-Attribut in Nachrichtenverträgen und Vorgangsverträgen nicht; verwenden Sie stattdessen das KnownTypeAttribute-Attribut.

Siehe auch

Aufgaben

Gewusst wie: Verbessern der Startzeit von WCF-Clientanwendungen mit dem XmlSerializer

Referenz

DataContractFormatAttribute
DataContractSerializer
XmlSerializer
MessageHeaderArrayAttribute

Konzepte

Angeben von Datenübertragung in Dienstverträgen
Verwenden von Datenverträgen