Freigeben über


System.Runtime.Serialization.DataContractSerializer-Klasse

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Verwenden Sie die DataContractSerializer-Klasse, um Instanzen eines Typs in einen XML-Stream oder ein XML-Dokument zu serialisieren oder zu deserialisieren. Sie können beispielsweise einen Typ mit dem Namen Person und Eigenschaften erstellen, die wichtige Daten wie Name und Adresse enthalten. Anschließend haben Sie die Möglichkeit, eine Instanz der Person-Klasse zu erstellen und zu bearbeiten. Sie können alle Eigenschaftswerte für den späteren Abruf in ein XML-Dokument oder für die sofortige Übertragung in einen XML-Stream schreiben. Am wichtigsten ist die Serialisierung und Deserialisierung von Daten, die DataContractSerializer in WCF-Nachrichten (Windows Communication Foundation) gesendet werden. Wenden Sie das DataContractAttribute-Attribut auf Klassen und das DataMemberAttribute-Attribut auf Klassenmember an, um die zu serialisierenden Eigenschaften und Felder anzugeben.

Eine Liste der Typen, die serialisiert werden können, finden Sie unter Typen, die vom Serialisierer für den Datenvertrag unterstützt werden.

Um den DataContractSerializer verwenden zu können, erstellen Sie zunächst eine Instanz einer Klasse und ein zum Schreiben bzw. Lesen des Formats geeignetes Objekt, z. B. eine Instanz des XmlDictionaryWriter-Objekts. Rufen Sie dann die WriteObject-Methode auf, um die Daten beizubehalten. Um Daten abzurufen, erstellen Sie ein zum Lesen des Datenformats geeignetes Objekt (z. B. einen XmlDictionaryReader für ein XML-Dokument), und rufen Sie die ReadObject-Methode auf.

Weitere Informationen zur Verwendung von DataContractSerializerSerialisierung und Deserialisierung finden Sie unter "Serialisierung" und "Deserialisierung".

Sie können den Typ eines Datenvertrags serializer mithilfe des <dataContractSerializer-Elements> in einer Clientanwendungskonfigurationsdatei festlegen.

Vorbereiten von Klassen für die Serialisierung oder Deserialisierung

Der DataContractSerializer wird in Verbindung mit den Klassen DataContractAttribute und DataMemberAttribute verwendet. Um eine Klasse auf die Serialisierung vorzubereiten, wenden Sie das DataContractAttribute auf die Klasse an. Wenden Sie für jeden Member der Klasse, der zu serialisierende Daten zurückgibt, das DataMemberAttribute an. Sie können Felder und Eigenschaften unabhängig von den Zugriffsrechten serialisieren: privat, geschützt, intern, geschützt intern oder öffentlich.

Beispiel: Ihr Schema gibt einen Customer mit einer ID-Eigenschaft an. Ein Typ mit dem Namen Person und der Eigenschaft Name wird jedoch bereits in einer vorhandenen Anwendung verwendet. Um einen Typ zu erstellen, der dem Vertrag entspricht, wenden Sie zunächst das DataContractAttribute auf die Klasse an. Wenden Sie dann das DataMemberAttribute auf alle Felder oder Eigenschaften an, die Sie serialisieren möchten.

Hinweis

Sie können das DataMemberAttribute sowohl auf private als auch auf öffentliche Member anwenden.

Das abschließende Format des XML muss kein Text sein. Der DataContractSerializer schreibt die Daten als XML-Infoset, sodass Sie die Daten in ein beliebiges Format übertragen können, das von XmlReader und XmlWriter erkannt wird. Es wird empfohlen, zum Lesen und Schreiben die Klassen XmlDictionaryReader und XmlDictionaryWriter zu verwenden, da diese für die Arbeit mit dem DataContractSerializer optimiert sind.

Wenn Sie eine Klasse erstellen, die Felder oder Eigenschaften enthält, die vor dem Auftreten der Serialisierung oder Deserialisierung aufgefüllt werden müssen, verwenden Sie Rückrufattribute, wie in Versionstoleranten Serialisierungsrückrufen beschrieben.

Zur Auflistung bekannter Typen hinzufügen

Bei der Serialisierung bzw. Deserialisierung eines Objekts muss der Typ dem DataContractSerializer bekannt sein. Erstellen Sie zunächst eine Instanz einer Klasse, die IEnumerable<T> implementiert (z. B. List<T>), und fügen Sie die bekannten Typen zu der Auflistung hinzu. Erstellen Sie dann eine Instanz der DataContractSerializer Verwendung einer der Überladungen, DataContractSerializer(Type, IEnumerable<Type>)die die IEnumerable<T> (z. B. ) verwendet.

Hinweis

Im Gegensatz zu anderen Grundtypen ist die DateTimeOffset Struktur standardmäßig kein bekannter Typ, daher muss sie der Liste bekannter Typen manuell hinzugefügt werden (siehe Bekannte Datentypen für Datenvertrag).

Aufwärtskompatibilität

Der DataContractSerializer kann Datenverträge verarbeiten, die für zukünftige Versionen des Vertrags konzipiert wurden. Typen dieser Art implementieren die IExtensibleDataObject-Schnittstelle. Die Schnittstelle enthält die ExtensionData-Eigenschaft, die ein ExtensionDataObject-Objekt zurückgibt. Weitere Informationen finden Sie unter Aufwärtskompatible Datenverträge.

Ausführen unter teilweiser Vertrauensstellung

Beim Instanziieren des Zielobjekts während der Deserialisierung ruft der DataContractSerializer nicht den Konstruktor des Zielobjekts auf. Wenn Sie einen [DataContract] -Typ erstellen, der von einer teilweisen Vertrauensstellung aus zugänglich ist (d. h. öffentlich und in einer Assembly, auf die das AllowPartiallyTrustedCallers Attribut angewendet wurde) und einige sicherheitsbezogene Aktionen ausführt, müssen Sie beachten, dass der Konstruktor nicht aufgerufen wird. Insbesondere die folgenden Techniken funktionieren nicht:

  • Sie können den teilweise vertrauenswürdigen Zugriff nicht einschränken, indem Sie den Konstruktor als intern oder privat definieren oder indem Sie einen LinkDemand zu dem Konstruktor hinzufügen. Beide Methoden sind bei der Deserialisierung unter teilweiser Vertrauenswürdigkeit unwirksam.
  • Wenn Sie die Klasse codieren, die angibt, dass der Konstruktor ausgeführt wurde, kann dies einen ungültigen internen Zustand der Klasse verursachen, der einen Angriffspunkt darstellt.