DataContractAttribute Klasse

Definition

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
DataContractAttribute
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)

Gilt für:

Weitere Informationen