DataContractAttribute Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt an, dass der Typ einen Datenvertrag definiert oder implementiert und von einem Serialisierer serialisierbar ist, z. B. die DataContractSerializer. Um ihren Typ serialisierbar zu machen, müssen Typautoren einen Datenvertrag für ihren Typ definieren.
public ref class DataContractAttribute sealed : Attribute
[System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)]
public sealed class DataContractAttribute : Attribute
[<System.AttributeUsage(System.AttributeTargets.Class | System.AttributeTargets.Enum | System.AttributeTargets.Struct, AllowMultiple=false, Inherited=false)>]
type DataContractAttribute = class
inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
- Vererbung
- Attribute
Beispiele
Im folgenden Beispiel wird eine Klasse serialisiert und deserialisiert, auf die die Person Klasse DataContractAttribute angewendet wurde. Beachten Sie, dass die und Namespace die Name Eigenschaften auf Werte festgelegt wurden, die die Standardeinstellungen außer Kraft setzen.
namespace DataContractAttributeExample
{
// Set the Name and Namespace properties to new values.
[DataContract(Name = "Customer", Namespace = "http://www.contoso.com")]
class Person : IExtensibleDataObject
{
// To implement the IExtensibleDataObject interface, you must also
// implement the ExtensionData property.
private ExtensionDataObject extensionDataObjectValue;
public ExtensionDataObject ExtensionData
{
get
{
return extensionDataObjectValue;
}
set
{
extensionDataObjectValue = value;
}
}
[DataMember(Name = "CustName")]
internal string Name;
[DataMember(Name = "CustID")]
internal int ID;
public Person(string newName, int newID)
{
Name = newName;
ID = newID;
}
}
class Test
{
public static void Main()
{
try
{
WriteObject("DataContractExample.xml");
ReadObject("DataContractExample.xml");
Console.WriteLine("Press Enter to end");
Console.ReadLine();
}
catch (SerializationException se)
{
Console.WriteLine
("The serialization operation failed. Reason: {0}",
se.Message);
Console.WriteLine(se.Data);
Console.ReadLine();
}
}
public static void WriteObject(string path)
{
// Create a new instance of the Person class and
// serialize it to an XML file.
Person p1 = new Person("Mary", 1);
// Create a new instance of a StreamWriter
// to read and write the data.
FileStream fs = new FileStream(path,
FileMode.Create);
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(fs);
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
ser.WriteObject(writer, p1);
Console.WriteLine("Finished writing object.");
writer.Close();
fs.Close();
}
public static void ReadObject(string path)
{
// Deserialize an instance of the Person class
// from an XML file. First create an instance of the
// XmlDictionaryReader.
FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
XmlDictionaryReader reader =
XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas());
// Create the DataContractSerializer instance.
DataContractSerializer ser =
new DataContractSerializer(typeof(Person));
// Deserialize the data and read it from the instance.
Person newPerson = (Person)ser.ReadObject(reader);
Console.WriteLine("Reading this object:");
Console.WriteLine(String.Format("{0}, ID: {1}",
newPerson.Name, newPerson.ID));
fs.Close();
}
}
}
Namespace DataContractAttributeExample
' Set the Name and Namespace properties to new values.
<DataContract(Name := "Customer", [Namespace] := "http://www.contoso.com")> _
Class Person
Implements IExtensibleDataObject
' To implement the IExtensibleDataObject interface, you must also
' implement the ExtensionData property.
Private extensionDataObjectValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return extensionDataObjectValue
End Get
Set
extensionDataObjectValue = value
End Set
End Property
<DataMember(Name := "CustName")> _
Friend Name As String
<DataMember(Name := "CustID")> _
Friend ID As Integer
Public Sub New(ByVal newName As String, ByVal newID As Integer)
Name = newName
ID = newID
End Sub
End Class
Class Test
Public Shared Sub Main()
Try
WriteObject("DataContractExample.xml")
ReadObject("DataContractExample.xml")
Console.WriteLine("Press Enter to end")
Console.ReadLine()
Catch se As SerializationException
Console.WriteLine("The serialization operation failed. Reason: {0}", _
se.Message)
Console.WriteLine(se.Data)
Console.ReadLine()
End Try
End Sub
Public Shared Sub WriteObject(ByVal path As String)
' Create a new instance of the Person class and
' serialize it to an XML file.
Dim p1 As New Person("Mary", 1)
' Create a new instance of a StreamWriter
' to read and write the data.
Dim fs As New FileStream(path, FileMode.Create)
Dim writer As XmlDictionaryWriter = XmlDictionaryWriter.CreateTextWriter(fs)
Dim ser As New DataContractSerializer(GetType(Person))
ser.WriteObject(writer, p1)
Console.WriteLine("Finished writing object.")
writer.Close()
fs.Close()
End Sub
Public Shared Sub ReadObject(ByVal path As String)
' Deserialize an instance of the Person class
' from an XML file. First create an instance of the
' XmlDictionaryReader.
Dim fs As New FileStream(path, FileMode.OpenOrCreate)
Dim reader As XmlDictionaryReader = XmlDictionaryReader. _
CreateTextReader(fs, New XmlDictionaryReaderQuotas())
' Create the DataContractSerializer instance.
Dim ser As New DataContractSerializer(GetType(Person))
' Deserialize the data and read it from the instance.
Dim newPerson As Person = CType(ser.ReadObject(reader), Person)
Console.WriteLine("Reading this object:")
Console.WriteLine(String.Format("{0}, ID: {1}", newPerson.Name, newPerson.ID))
fs.Close()
End Sub
End Class
End Namespace
Hinweise
Wenden Sie das DataContractAttribute Attribut auf Typen (Klassen, Strukturen oder Enumerationen) an, die in Serialisierungs- und Deserialisierungsvorgängen durch die DataContractSerializer verwendet werden. Wenn Sie Nachrichten mithilfe der Windows Communication Foundation (WCF)-Infrastruktur senden oder empfangen, sollten Sie das DataContractAttribute auch auf alle Klassen anwenden, die in Nachrichten gesendete Daten enthalten und bearbeiten. Weitere Informationen zu Datenverträgen finden Sie unter Verwenden von Datenverträgen.
Sie müssen DataMemberAttribute auch auf jedes Feld, jede Eigenschaft oder jedes Ereignis anwenden, das Werte enthält, die Sie serialisieren möchten. Durch Anwenden des DataContractAttribute ermöglichen es Sie dem DataContractSerializer, die Daten explizit zu serialisieren und zu deserialisieren.
Caution
Sie können die DataMemberAttribute auf private Felder anwenden. Beachten Sie, dass die vom Feld zurückgegebenen Daten (auch wenn es privat ist) serialisiert und deserialisiert werden und somit von einem böswilligen Benutzer oder Prozess angezeigt oder abgefangen werden können.
Weitere Informationen zu Datenverträgen finden Sie in den Themen unter Verwendung von Datenverträgen.
Datenverträge
Ein Datenvertrag ist eine abstrakte Beschreibung einer Gruppe von Feldern mit einem Namen und Datentyp für jedes Feld. Der Datenvertrag ist außerhalb einer einzelnen Implementierung vorhanden, damit Dienste auf verschiedenen Plattformen zusammenarbeiten können. Solange die zwischen den Diensten übergebenen Daten demselben Vertrag entsprechen, können alle Dienste die Daten verarbeiten. Diese Verarbeitung wird auch als lose gekoppeltes System bezeichnet. Ein Datenvertrag ähnelt auch einer Schnittstelle, in der der Vertrag angibt, wie Daten übermittelt werden müssen, damit sie von einer Anwendung verarbeitet werden können. Der Datenvertrag kann z. B. einen Datentyp namens "Person" mit zwei Textfeldern namens "Vorname" und "Nachname" aufrufen. Um einen Datenvertrag zu erstellen, wenden Sie die DataContractAttribute Klasse an, und wenden Sie die DataMemberAttribute auf alle Felder oder Eigenschaften an, die serialisiert werden müssen. Bei der Serialisierung entsprechen die Daten dem Datenvertrag, der implizit in den Typ integriert ist.
Note
Ein Datenvertrag unterscheidet sich erheblich von einer tatsächlichen Schnittstelle im Vererbungsverhalten. Schnittstellen werden an abgeleitete Typen vererbt. Wenn Sie die DataContractAttribute Auf eine Basisklasse anwenden, erben die abgeleiteten Typen nicht das Attribut oder das Verhalten. Wenn ein abgeleiteter Typ jedoch über einen Datenvertrag verfügt, werden die Datenmitglieder der Basisklasse serialisiert. Sie müssen jedoch die neuen Member in einer abgeleiteten Klasse mit DataMemberAttribute markieren, um sie serialisierbar zu machen.
XML-Schemadokumente und das SvcUtil-Tool
Wenn Sie Daten mit anderen Diensten austauschen, müssen Sie den Datenvertrag beschreiben. Für die aktuelle Version des DataContractSerializerXml-Schemas kann ein XML-Schema verwendet werden, um Datenverträge zu definieren. (Andere Formen von Metadaten/Beschreibungen können für denselben Zweck verwendet werden.) Um ein XML-Schema aus Ihrer Anwendung zu erstellen, verwenden Sie das ServiceModel Metadata Utility Tool (Svcutil.exe) mit der Befehlszeilenoption "/dconly ". Wenn die Eingabe für das Tool standardmäßig eine Assembly ist, generiert das Tool eine Reihe von XML-Schemas, die alle in dieser Assembly gefundenen Datentypen definieren. Umgekehrt können Sie auch das Svcutil.exe Tool verwenden, um Visual Basic- oder C#-Klassendefinitionen zu erstellen, die den Anforderungen von XML-Schemas entsprechen, die Konstrukte verwenden, die durch Datenverträge ausgedrückt werden können. In diesem Fall ist die Befehlszeilenoption "/dconly " nicht erforderlich.
Wenn es sich bei der Eingabe für das Svcutil.exe-Tool um ein XML-Schema handelt, erstellt das Tool standardmäßig eine Reihe von Klassen. Wenn Sie diese Klassen untersuchen, stellen Sie fest, dass DataContractAttribute angewendet wurde. Sie können diese Klassen verwenden, um eine neue Anwendung zum Verarbeiten von Daten zu erstellen, die mit anderen Diensten ausgetauscht werden müssen.
Sie können das Tool auch für einen Endpunkt ausführen, der ein WSDL-Dokument (Web Services Description Language) zurückgibt, um den Code und die Konfiguration automatisch zu generieren, um einen Windows Communication Foundation (WCF)-Client zu erstellen. Der generierte Code enthält Typen, die mit DataContractAttribute markiert sind.
Vorhandene Typen wiederverwenden
Ein Datenvertrag hat zwei grundlegende Anforderungen: einen stabilen Namen und eine Liste von Mitgliedern. Der stabile Name besteht aus dem Namespace uniform resource identifier (URI) und dem lokalen Namen des Vertrags. Wenn Sie die DataContractAttribute Klasse auf eine Klasse anwenden, verwendet sie standardmäßig den Klassennamen als lokalen Namen und den Namespace der Klasse (präfixiert mit "http://schemas.datacontract.org/2004/07/"dem Präfix ) als Namespace-URI. Sie können die Standardwerte überschreiben, indem Sie die Name und die Namespace Eigenschaften festlegen. Sie können den Namespace auch ändern, indem Sie ContractNamespaceAttribute auf den Namespace anwenden. Verwenden Sie diese Funktion, wenn Sie über einen vorhandenen Typ verfügen, der Daten genau so verarbeitet, wie Sie es benötigen, aber über einen anderen Namespace- und Klassennamen als den Datenvertrag verfügt. Durch Überschreiben der Standardwerte können Sie Ihren vorhandenen Typ wiederverwenden und die serialisierten Daten dem Datenvertrag entsprechen lassen.
Note
In jedem Code können Sie das Wort DataContract anstelle des längeren DataContractAttributeWorts verwenden.
Versionsverwaltung
Ein Datenvertrag kann auch spätere Versionen von sich selbst berücksichtigen. Das heißt, wenn eine spätere Version des Vertrags zusätzliche Daten enthält, werden diese Daten gespeichert und an einen Absender unverändert zurückgegeben. Implementieren Sie dazu die IExtensibleDataObject Schnittstelle.
Weitere Informationen zur Versionsverwaltung finden Sie unter Datenvertragsversionsverwaltung.
Konstruktoren
| Name | Beschreibung |
|---|---|
| DataContractAttribute() |
Initialisiert eine neue Instanz der DataContractAttribute-Klasse. |
Eigenschaften
| Name | Beschreibung |
|---|---|
| IsNameSetExplicitly |
Ruft ab, ob Name explizit festgelegt wurde. |
| IsNamespaceSetExplicitly |
Ruft ab, ob Namespace explizit festgelegt wurde. |
| IsReference |
Ruft einen Wert ab oder legt einen Wert fest, der angibt, ob Objektverweisdaten beizubehalten sind. |
| IsReferenceSetExplicitly |
Ruft ab, ob IsReference explizit festgelegt wurde. |
| Name |
Ruft den Namen des Datenvertrags für den Typ ab oder legt ihn fest. |
| Namespace |
Ruft den Namespace des Datenvertrags für den Typ ab oder legt ihn fest. |
| TypeId |
Wenn sie in einer abgeleiteten Klasse implementiert wird, wird ein eindeutiger Bezeichner für diese Attribute. (Geerbt von Attribute) |
Methoden
| Name | Beschreibung |
|---|---|
| Equals(Object) |
Gibt einen Wert zurück, der angibt, ob diese Instanz einem angegebenen Objekt entspricht. (Geerbt von Attribute) |
| GetHashCode() |
Gibt den Hashcode für diesen instance zurück. (Geerbt von Attribute) |
| GetType() |
Ruft die Type der aktuellen Instanz ab. (Geerbt von Object) |
| IsDefaultAttribute() |
Wenn sie in einer abgeleiteten Klasse überschrieben wird, gibt an, ob der Wert dieser Instanz der Standardwert für die abgeleitete Klasse ist. (Geerbt von Attribute) |
| Match(Object) |
Wenn sie in einer abgeleiteten Klasse überschrieben wird, wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem angegebenen Objekt entspricht. (Geerbt von Attribute) |
| MemberwiseClone() |
Erstellt eine flache Kopie der aktuellen Object. (Geerbt von Object) |
| ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |
Explizite Schnittstellenimplementierungen
| Name | Beschreibung |
|---|---|
| _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) |
Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu. (Geerbt von Attribute) |
| _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) |
Ruft die Typinformationen für ein Objekt ab, mit denen die Typinformationen für eine Schnittstelle abgerufen werden können. (Geerbt von Attribute) |
| _Attribute.GetTypeInfoCount(UInt32) |
Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1). (Geerbt von Attribute) |
| _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) |
Bietet Zugriff auf Eigenschaften und Methoden, die von einem Objekt verfügbar gemacht werden. (Geerbt von Attribute) |