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.
Ein Datenvertrag ist ein formeller Vertrag zwischen einem Dienst und einem Kunden, der die zu tauschenden Daten abstrakt beschreibt. Das heißt, der Client und der Dienst müssen, um kommunizieren zu können, nicht denselben Typ verwenden, sondern nur dieselben Datenverträge. Ein Datenvertrag definiert für jeden Parameter oder Rückgabetyp genau, welche Daten serialisiert (in XML umgewandelt) werden sollen.
Grundlagen des Datenvertrags
Windows Communication Foundation (WCF) verwendet standardmäßig ein Serialisierungsmodul namens "Data Contract Serializer", um Daten zu serialisieren und zu deserialisieren (konvertieren sie in und aus XML). Alle .NET Framework-Grundtypen, wie z. B. ganze Zahlen und Zeichenfolgen, sowie bestimmte Typen, die als Grundtypen behandelt werden, wie DateTime und XmlElement, können ohne weitere Vorbereitung serialisiert werden und gelten als Standarddatenverträge. Viele .NET Framework-Typen verfügen auch über vorhandene Datenverträge. Eine vollständige Liste der serialisierbaren Typen finden Sie unter Typen, die vom Serialisierer für den Datenvertrag unterstützt werden.
Neue komplexe Typen, die Sie erstellen, müssen über einen Datenvertrag verfügen, der für sie serialisierbar ist. Standardmäßig leitet der DataContractSerializer den Datenvertrag ab und serialisiert alle öffentlich sichtbaren Typen. Alle öffentlichen Lese- und Schreibeigenschaften und Felder des Typs werden serialisiert. Sie können Mitglieder von der Serialisierung ausschließen, indem Sie die IgnoreDataMemberAttribute verwenden. Sie können auch explizit einen Datenvertrag mithilfe DataContractAttribute und DataMemberAttribute Attribute erstellen. Dies erfolgt normalerweise durch Anwenden des DataContractAttribute Attributs auf den Typ. Dieses Attribut kann auf Klassen, Strukturen und Enumerationen angewendet werden. Das DataMemberAttribute-Attribut muss dann auf jedes Mitglied des Datenvertrags angewendet werden, um anzugeben, dass es sich um ein Datenmitglied handelt, d. h., es sollte serialisiert werden. Weitere Informationen finden Sie unter serialisierbare Typen.
Beispiel
Das folgende Beispiel zeigt einen Dienstvertrag (eine Schnittstelle), auf die die Attribute ServiceContractAttribute und OperationContractAttribute explizit angewendet wurden. Das Beispiel zeigt, dass primitive Typen keinen Datenvertrag erfordern, während ein komplexer Typ einen benötigt.
[ServiceContract]
public interface ISampleInterface
{
// No data contract is required since both the parameter
// and return types are primitive types.
[OperationContract]
double SquareRoot(int root);
// No Data Contract required because both parameter and return
// types are marked with the SerializableAttribute attribute.
[OperationContract]
System.Drawing.Bitmap GetPicture(System.Uri pictureUri);
// The MyTypes.PurchaseOrder is a complex type, and thus
// requires a data contract.
[OperationContract]
bool ApprovePurchaseOrder(MyTypes.PurchaseOrder po);
}
<ServiceContract()> _
Public Interface ISampleInterface
' No data contract is required since both the parameter and return
' types are both primitive types.
<OperationContract()> _
Function SquareRoot(ByVal root As Integer) As Double
' No Data Contract required because both parameter and return
' types are marked with the SerializableAttribute attribute.
<OperationContract()> _
Function GetPicture(ByVal pictureUri As System.Uri) As System.Drawing.Bitmap
' The MyTypes.PurchaseOrder is a complex type, and thus
' requires a data contract.
<OperationContract()> _
Function ApprovePurchaseOrder(ByVal po As MyTypes.PurchaseOrder) As Boolean
End Interface
Das folgende Beispiel zeigt, wie ein Datenvertrag für den MyTypes.PurchaseOrder-Typ erstellt wird, indem die Attribute DataContractAttribute und DataMemberAttribute auf die Klasse und ihre Mitglieder angewendet werden.
namespace MyTypes
{
[DataContract]
public class PurchaseOrder
{
private int poId_value;
// Apply the DataMemberAttribute to the property.
[DataMember]
public int PurchaseOrderId
{
get { return poId_value; }
set { poId_value = value; }
}
}
}
Namespace MyTypes
<System.Runtime.Serialization.DataContractAttribute()> _
Public Class PurchaseOrder
Private poId_value As Integer
' Apply the DataMemberAttribute to the property.
<DataMember()> _
Public Property PurchaseOrderId() As Integer
Get
Return poId_value
End Get
Set
poId_value = value
End Set
End Property
End Class
End Namespace
Hinweise
Die folgenden Hinweise enthalten Elemente, die beim Erstellen von Datenverträgen berücksichtigt werden sollten:
Das IgnoreDataMemberAttribute Attribut wird nur bei Verwendung mit nichtmarkierten Typen berücksichtigt. Dies schließt Typen ein, die nicht mit einem der DataContractAttribute, SerializableAttribute, CollectionDataContractAttribute oder EnumMemberAttribute Attribute markiert sind, oder die auf andere Weise (z. B. als serialisierbar) gekennzeichnet sind.
Sie können das DataMemberAttribute Attribut auf Felder und Eigenschaften anwenden.
Die Barrierefreiheitsebenen der Mitglieder (intern, privat, geschützt oder öffentlich) wirken sich nicht auf den Datenvertrag aus.
Das DataMemberAttribute Attribut wird ignoriert, wenn es auf statische Member angewendet wird.
Während der Serialisierung wird der Property-get-Code für Eigenschaftsdatenelemente aufgerufen, um den Wert der zu serialisierenden Eigenschaften abzurufen.
Während der Deserialisierung wird zunächst ein nicht initialisiertes Objekt erstellt, ohne Konstruktoren für den Typ aufzurufen. Dann werden alle Datenmitglieder deserialisiert.
Mit einem Aufruf von property-set-Code für Eigenschaftsdatenmember werden bei der Deserialisierung die Werte der zu deserialisierenden Eigenschaften festgelegt.
Um ein Datenvertrag gültig zu machen, muss es möglich sein, alle seine Datenmitglieder zu serialisieren. Eine vollständige Liste der serialisierbaren Typen finden Sie unter Typen, die vom Serialisierer für den Datenvertrag unterstützt werden.
Generische Typen werden genau auf die gleiche Weise wie nicht generische Typen behandelt. Es gibt keine speziellen Anforderungen für generische Parameter. Betrachten Sie z. B. den folgenden Typ.
[DataContract]
public class MyGenericType1<T>
{
// Code not shown.
}
<DataContract()> _
Public Class MyGenericType1(Of T)
' Code not shown.
End Class
Dieser Typ kann serialisiert werden, ob der für den generischen Typparameter (T) verwendete Typ serialisierbar ist oder nicht. Da es möglich sein muss, alle Datenmember zu serialisieren, kann der folgende Typ nur serialisiert werden, wenn der generische Typparameter auch serialisierbar ist, wie im folgenden Code gezeigt.
[DataContract]
public class MyGenericType2<T>
{
[DataMember]
T theData;
}
<DataContract()> _
Public Class MyGenericType2(Of T)
<DataMember()> _
Dim theData As T
End Class
Ein vollständiges Codebeispiel eines WCF-Diensts, der einen Datenvertrag definiert, finden Sie im Beispiel " Standarddatenvertrag ".
Siehe auch
- DataMemberAttribute
- DataContractAttribute
- Serialisierbare Typen
- Datenvertragsnamen
- Gleichwertigkeit des Datenvertrags
- Datenmitgliedsreihenfolge
- Bekannte Datenvertragstypen
- Forward-Compatible Datenverträge
- Datenvertragsversionsverwaltung
- Versionstolerante Serialisierungsrückrufe
- Standardwerte der Datenelemente
- Vom Serialisierungsprogramm für den Datenvertrag unterstützte Typen
- Vorgehensweise: Erstellen eines Basisdatenvertrags für eine Klasse oder Struktur