DataContractAttribute DataContractAttribute DataContractAttribute DataContractAttribute Class

Definition

Gibt an, dass der Typ einen Datenvertrag definiert oder implementiert und mit einem Serialisierer wie dem DataContractSerializer serialisierbar ist.Specifies that the type defines or implements a data contract and is serializable by a serializer, such as the DataContractSerializer. Um ihren Typ serialisierbar zu machen, müssen die Autoren hierfür einen Datenvertrag definieren.To make their type serializable, type authors must define a data contract for their type.

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
type DataContractAttribute = class
    inherit Attribute
Public NotInheritable Class DataContractAttribute
Inherits Attribute
Vererbung
DataContractAttributeDataContractAttributeDataContractAttributeDataContractAttribute
Attribute

Beispiele

Im folgenden Beispiel wird eine Klasse mit dem Namen Person serialisiert und deserialisiert, auf die der DataContractAttribute angewendet wurde.The following example serializes and deserializes a class named Person to which the DataContractAttribute has been applied. Beachten Sie, dass für die Namespace-Eigenschaft und die Name-Eigenschaft Werte festgelegt wurden, die die Standardeinstellungen überschreiben.Note that the Namespace and Name properties have been set to values that override the default settings.

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 bei Serialisierungs- und Deserialisierungsvorgängen vom DataContractSerializer verwendet werden.Apply the DataContractAttribute attribute to types (classes, structures, or enumerations) that are used in serialization and deserialization operations by the DataContractSerializer. Wenn Sie Nachrichten mithilfe der Windows Communication Foundation (WCF)-Infrastruktur senden oder empfangen, sollten Sie auch DataContractAttribute auf alle Klassen anwenden, die in Nachrichten gesendete Daten enthalten und bearbeiten.If you send or receive messages by using the Windows Communication Foundation (WCF) infrastructure, you should also apply the DataContractAttribute to any classes that hold and manipulate data sent in messages. Weitere Informationen zu Daten Verträgen finden Sie unter Verwenden von Daten Verträgen.For more information about data contracts, see Using Data Contracts.

Sie müssen den DataMemberAttribute auch auf alle Felder, Eigenschaften oder Ereignisse anwenden, die Werte enthalten, die Sie serialisieren möchten.You must also apply the DataMemberAttribute to any field, property, or event that holds values you want to serialize. Indem Sie den DataContractAttribute anwenden, aktivieren Sie explizit den DataContractSerializer zum Serialisieren und Deserialisieren der Daten.By applying the DataContractAttribute, you explicitly enable the DataContractSerializer to serialize and deserialize the data.

Achtung

Sie können den DataMemberAttribute auf private Felder anwenden.You can apply the DataMemberAttribute to private fields. Beachten Sie, dass die von dem Feld zurückgegebenen Daten (auch bei privaten Feldern) serialisiert und deserialisiert werden und daher von böswilligen Benutzern oder Vorgängen angezeigt oder abgefangen werden können.Be aware that the data returned by the field (even if it is private) is serialized and deserialized, and thus can be viewed or intercepted by a malicious user or process.

Weitere Informationen zu Daten Verträgen finden Sie in den unter Verwenden von Daten Verträgenaufgeführten Themen.For more information about data contracts, see the topics listed in Using Data Contracts.

DatenverträgeData Contracts

Ein Datenvertrag ist eine abstrakte Beschreibung einer Gruppe von Feldern mit einem Namen und einem Datentyp für jedes Feld.A data contract is an abstract description of a set of fields with a name and data type for each field. Der Datenvertrag befindet sich außerhalb einzelner Implementierungen, um die Zusammenarbeit zwischen den Diensten verschiedener Plattformen zu ermöglichen.The data contract exists outside of any single implementation to allow services on different platforms to interoperate. Solange die zwischen den Diensten übermittelten Daten demselben Vertrag entsprechen, können sie von allen Diensten verarbeitet werden.As long as the data passed between the services conforms to the same contract, all the services can process the data. Diese Verarbeitung wird auch als locker gekoppeltes Systembezeichnet.This processing is also known as a loosely coupled system. Ein Datenvertrag ist auch mit einer Schnittstelle vergleichbar, da der Vertrag angibt, wie die Daten zu übermitteln sind, um von einer Anwendung verarbeitet werden zu können.A data contract is also similar to an interface in that the contract specifies how data must be delivered so that it can be processed by an application. Der Datenvertrag kann beispielsweise einen Datentyp mit der Bezeichnung 'Person' erfordern, der zwei Textfelder mit der Bezeichnung 'Vorname' und 'Nachname' enthält.For example, the data contract may call for a data type named "Person" that has two text fields, named "FirstName" and "LastName". Um einen Datenvertrag zu erstellen, können Sie den DataContractAttribute auf die Klasse anwenden und den DataMemberAttribute auf Felder oder Eigenschaften anwenden, die serialisiert werden müssen.To create a data contract, apply the DataContractAttribute to the class and apply the DataMemberAttribute to any fields or properties that must be serialized. Wenn die Daten serialisiert sind, entsprechen sie dem implizit in den Typ integrierten Datenvertrag.When serialized, the data conforms to the data contract that is implicitly built into the type.

Hinweis

Ein Datenvertrag unterscheidet sich in seinem Vererbungsverhalten deutlich von einer tatsächlichen Schnittstelle.A data contract differs significantly from an actual interface in its inheritance behavior. Schnittstellen werden an abgeleitete Typen vererbt.Interfaces are inherited by any derived types. Wenn Sie den DataContractAttribute auf eine Basisklasse anwenden, erben die abgeleiteten Typen das Attribut oder das Verhalten nicht.When you apply the DataContractAttribute to a base class, the derived types do not inherit the attribute or the behavior. Wenn ein abgeleiteter Typ jedoch einen Datenvertrag hat, werden die Datenmember der Basisklasse serialisiert.However, if a derived type has a data contract, the data members of the base class are serialized. Sie müssen den DataMemberAttribute jedoch auf neue Member in einer abgeleiteten Klasse anwenden, um sie serialisierbar zu machen.However, you must apply the DataMemberAttribute to new members in a derived class to make them serializable.

XML-Schemadokumente und das Tool SvcUtilXML Schema Documents and the SvcUtil Tool

Wenn Sie Daten mit anderen Diensten austauschen, muss der Datenvertrag beschrieben werden.If you are exchanging data with other services, you must describe the data contract. Für die aktuelle Version des DataContractSerializer kann ein XML-Schema verwendet werden, um Datenverträge zu definieren.For the current version of the DataContractSerializer, an XML schema can be used to define data contracts. (Andere Formen von Metadaten/Beschreibungen können zum selben Zweck verwendet werden.) Verwenden Sie zum Erstellen eines XML-Schemas aus der Anwendung das Service Model Metadata Utility-Tool (Svcutil. exe) mit der /dconly -Befehlszeilenoption.(Other forms of metadata/description could be used for the same purpose.) To create an XML schema from your application, use the ServiceModel Metadata Utility Tool (Svcutil.exe) with the /dconly command line option. Wenn das Input in Ihr Tool eine Assembly ist, generiert das Tool standardmäßig eine Gruppe von XML-Schemas, die alle in dieser Assembly gefundenen Datenvertragstypen definieren.When the input to the tool is an assembly, by default, the tool generates a set of XML schemas that define all the data contract types found in that assembly. Umgekehrt können Sie das Tool Svcutil.exe auch verwenden, um den Anforderungen von XML-Schemas entsprechende Klassendefinitionen für Visual Basic oder C# zu erstellen, die Konstrukte verwenden, die durch Datenverträge ausgedrückt werden können.Conversely, you can also use the Svcutil.exe tool to create Visual Basic or C# class definitions that conform to the requirements of XML schemas that use constructs that can be expressed by data contracts. In diesem Fall ist die Befehlszeilenoption /dconly nicht erforderlich.In this case, the /dconly command line option is not required.

Wenn in das Tool Svcutil.exe ein XML-Schema eingegeben wird, erstellt das Tool standardmäßig eine Reihe von Klassen.If the input to the Svcutil.exe tool is an XML schema, by default, the tool creates a set of classes. Wenn Sie diese Klassen prüfen, stellen Sie fest, dass der DataContractAttribute verwendet wurde.If you examine those classes, you find that the DataContractAttribute has been applied. Sie können diese Klassen verwenden, um eine neue Anwendung zur Verarbeitung von Daten zu erstellen, die mit anderen Diensten ausgetauscht werden müssen.You can use those classes to create a new application to process data that must be exchanged with other services.

Sie können das Tool auch für einen Endpunkt ausführen, der ein Web Services Description Language (WSDL)-Dokument zurückgibt, mit dem der Code und die Konfiguration automatisch generiert werden, um einen Windows Communication Foundation (WCF)-Client zu erstellen.You can also run the tool against an endpoint that returns a Web Services Description Language (WSDL) document to automatically generate the code and configuration to create an Windows Communication Foundation (WCF) client. Der generierte Code schließt Typen ein, die mit dem DataContractAttribute gekennzeichnet sind.The generated code includes types that are marked with the DataContractAttribute.

Wiederverwendung vorhandener TypenReusing Existing Types

Ein Datenvertrag verfügt über zwei grundlegende Anforderungen: einen stabilen Namen und eine Liste von Membern.A data contract has two basic requirements: a stable name and a list of members. Der stabile Name besteht aus dem Namespace-URI (Uniform Resource Identifier) und dem lokalen Namen des Vertrags.The stable name consists of the namespace uniform resource identifier (URI) and the local name of the contract. Wenn Sie das DataContractAttribute auf eine Klasse anwenden, wird standardmäßig der Klassenname als lokaler Name und der Namespace der Klasse (mit "http://schemas.datacontract.org/2004/07/"dem Präfix) als Namespace-URI verwendet.By default, when you apply the DataContractAttribute to a class, it uses the class name as the local name and the class's namespace (prefixed with "http://schemas.datacontract.org/2004/07/") as the namespace URI. Diese Standardwerte können durch Festlegen der Eigenschaften Name und Namespace überschrieben werden.You can override the defaults by setting the Name and Namespace properties. Sie können auch den Namespace ändern, indem Sie den ContractNamespaceAttribute auf den Namespace anwenden.You can also change the namespace by applying the ContractNamespaceAttribute to the namespace. Sie können diese Fähigkeit bei einem bestehenden Typ nutzen, der Daten genau nach Ihren Anforderungen verarbeitet, jedoch einen anderen Namespace und Klassennamen aufweist als im Datenvertrag.Use this capability when you have an existing type that processes data exactly as you require but has a different namespace and class name from the data contract. Durch Überschreiben der Standardwerte können Sie Ihren vorhandenen Typ wiederverwenden und gewährleisten, dass die serialisierten Daten dem Datenvertrag entsprechen.By overriding the default values, you can reuse your existing type and have the serialized data conform to the data contract.

Hinweis

In jedem Code können Sie das Wort DataContract anstelle des längeren DataContractAttribute verwenden.In any code, you can use the word DataContract instead of the longer DataContractAttribute.

VersionskontrolleVersioning

Ein Datenvertrag kann auch höhere Versionen seiner selbst nutzen.A data contract can also accommodate later versions of itself. Wenn eine höhere Version des Vertrags zusätzliche Daten enthält, werden diese Daten gespeichert und unverändert an den Absender zurückgegeben.That is, when a later version of the contract includes extra data, that data is stored and returned to a sender untouched. Hierzu müssen Sie die IExtensibleDataObject-Schnittstelle implementieren.To do this, implement the IExtensibleDataObject interface.

Weitere Informationen zur Versionsverwaltung finden Sie unter Data Contract Versioning.For more information about versioning, see Data Contract Versioning.

Konstruktoren

DataContractAttribute() DataContractAttribute() DataContractAttribute() DataContractAttribute()

Initialisiert eine neue Instanz der DataContractAttribute-Klasse.Initializes a new instance of the DataContractAttribute class.

Eigenschaften

IsNameSetExplicitly IsNameSetExplicitly IsNameSetExplicitly IsNameSetExplicitly

Ruft ab, ob Name explizit festgelegt wurde.Gets whether Name has been explicitly set.

IsNamespaceSetExplicitly IsNamespaceSetExplicitly IsNamespaceSetExplicitly IsNamespaceSetExplicitly

Ruft ab, ob Namespace explizit festgelegt wurde.Gets whether Namespace has been explicitly set.

IsReference IsReference IsReference IsReference

Ruft einen Wert ab oder legt einen Wert fest, der angibt, ob Objektverweisdaten beizubehalten sind.Gets or sets a value that indicates whether to preserve object reference data.

IsReferenceSetExplicitly IsReferenceSetExplicitly IsReferenceSetExplicitly IsReferenceSetExplicitly

Ruft ab, ob IsReference explizit festgelegt wurde.Gets whether IsReference has been explicitly set.

Name Name Name Name

Ruft den Namen des Datenvertrags für den Typ ab oder legt ihn fest.Gets or sets the name of the data contract for the type.

Namespace Namespace Namespace Namespace

Ruft den Namespace des Datenvertrags für den Typ ab oder legt ihn fest.Gets or sets the namespace for the data contract for the type.

TypeId TypeId TypeId TypeId

Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab.When implemented in a derived class, gets a unique identifier for this Attribute.

(Inherited from Attribute)

Methoden

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.Returns a value that indicates whether this instance is equal to a specified object.

(Inherited from Attribute)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Gibt den Hashcode für diese Instanz zurück.Returns the hash code for this instance.

(Inherited from Attribute)
GetType() GetType() GetType() GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Inherited from Object)
IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute() IsDefaultAttribute()

Gibt beim Überschreiben in einer abgeleiteten Klasse an, ob der Wert der Instanz der Standardwert für die abgeleitete Klasse ist.When overridden in a derived class, indicates whether the value of this instance is the default value for the derived class.

(Inherited from Attribute)
Match(Object) Match(Object) Match(Object) Match(Object)

Beim Überschreiben in einer abgeleiteten Klasse wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem bestimmten Objekt entspricht.When overridden in a derived class, returns a value that indicates whether this instance equals a specified object.

(Inherited from Attribute)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Inherited from Object)

Explizite Schnittstellenimplementierungen

_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr) _Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu.Maps a set of names to a corresponding set of dispatch identifiers.

(Inherited from Attribute)
_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr) _Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Ruft die Typinformationen für ein Objekt ab, mit deren Hilfe die Typinformationen für eine Schnittstelle abgerufen werden können.Retrieves the type information for an object, which can be used to get the type information for an interface.

(Inherited from Attribute)
_Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32) _Attribute.GetTypeInfoCount(UInt32)

Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1).Retrieves the number of type information interfaces that an object provides (either 0 or 1).

(Inherited from Attribute)
_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr) _Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Stellt den Zugriff auf von einem Objekt verfügbar gemachte Eigenschaften und Methoden bereit.Provides access to properties and methods exposed by an object.

(Inherited from Attribute)

Gilt für:

Siehe auch