Aufwärtskompatible DatenverträgeForward-Compatible Data Contracts

Eine Funktion von der Windows Communication Foundation (WCF) ist, die Verträge kann im-datenvertragssystems Laufe der Zeit ändern.A feature of the Windows Communication Foundation (WCF) data contract system is that contracts can evolve over time in nonbreaking ways. Dies bedeutet, dass ein Client mit einer älteren Version eines Datenvertrags mit einem Dienst, der eine neuere Version dieses Datenvertrags aufweist, kommunizieren kann bzw. dass ein Client mit einer neueren Version eines Datenvertrags mit einer älteren Version dieses Datenvertrags kommunizieren kann.That is, a client with an older version of a data contract can communicate with a service with a newer version of the same data contract, or a client with a newer version of a data contract can communicate with an older version of the same data contract. Weitere Informationen finden Sie unter Vorgehensweisen: versionsverwaltung von Datenverträgen.For more information, see Best Practices: Data Contract Versioning.

Sie können beim Erstellen neuer Versionen eines bestehenden Datenvertrags die meisten Versionsverwaltungsfunktionen nach Bedarf verwenden.You can apply most of the versioning features on an as-needed basis when new versions of an existing data contract are created. Allerdings eine Versionsverwaltungsfunktion, Round-Tripping, muss in den Typ der ersten Version erstellt werden, damit Sie richtig funktioniert.However, one versioning feature, round-tripping, must be built into the type from the first version in order to work properly.

Roundtrip-FunktionRound-Tripping

Ein Roundtrip findet statt, wenn Daten von einer neuen Version an eine alte Version und wieder zurück an die neue Version eines Datenvertrags übergeben werden.Round-tripping occurs when data passes from a new version to an old version and back to the new version of a data contract. Durch den Roundtrip wird sichergestellt, dass keine Daten verloren gehen.Round-tripping guarantees that no data is lost. Durch die aktivierte Roundtrip-Funktion wird der Typ aufwärtskompatibel, das heißt, dass alle zukünftigen Änderungen vom Versionsverwaltungsmodell des Datenvertrags unterstützt werden.Enabling round-tripping makes the type forward-compatible with any future changes supported by the data contract versioning model.

Um die Roundtrip-Funktion für einen bestimmten Typ zu aktivieren, muss der Typ die IExtensibleDataObject-Schnittstelle implementieren.To enable round-tripping for a particular type, the type must implement the IExtensibleDataObject interface. Die Schnittstelle enthält die ExtensionData-Eigenschaft (und gibt den ExtensionDataObject-Typ zurück).The interface contains one property, ExtensionData (returning the ExtensionDataObject type). In der Eigenschaft werden alle Daten aus zukünftigen Versionen des Datenvertrags, die in der aktuellen Version unbekannt sind, gespeichert.The property stores any data from future versions of the data contract that is unknown to the current version.

BeispielExample

Der folgende Datenvertrag ist nicht mit zukünftigen Änderungen aufwärtskompatibel:The following data contract is not forward-compatible with future changes.

[DataContract]
public class Person
{
    [DataMember]
    public string fullName;
}
<DataContract()>  _
Public Class Person
    <DataMember()>  _
    Public fullName As String
End Class 

Damit der Typ mit zukünftigen Änderungen (wie zum Beispiel einem hinzugefügten Datenmember "phoneNumber") kompatibel wird, muss die IExtensibleDataObject-Schnittstelle implementiert werden.To make the type compatible with future changes (such as adding a new data member named "phoneNumber"), implement the IExtensibleDataObject interface.

[DataContract]
public class Person : IExtensibleDataObject
{
    [DataMember]
    public string fullName;
    private ExtensionDataObject theData;

    public virtual ExtensionDataObject ExtensionData
    {
        get { return theData; }
        set { theData = value; }
    }
}
<DataContract()>  _
Public Class Person
    Implements IExtensibleDataObject
    <DataMember()>  _
    Public fullName As String
    Private theData As ExtensionDataObject
    
    
    Public Overridable Property ExtensionData() As _
     ExtensionDataObject Implements _
     IExtensibleDataObject.ExtensionData
        Get
            Return theData
        End Get
        Set
            theData = value
        End Set
    End Property
End Class 

Wenn die WCF-Infrastruktur Daten, die nicht Teil des ursprünglichen Datenvertrag ist trifft, wird die Daten in der Eigenschaft gespeichert und beibehalten.When the WCF infrastructure encounters data that is not part of the original data contract, the data is stored in the property and preserved. Eine Verarbeitung erfolgt nur für die vorübergehende Speicherung.It is not processed in any other way except for temporary storage. Wird das Objekt an seinen Ursprungsort zurückgegeben, werden die ursprünglichen (unbekannten) Daten ebenfalls zurückgegeben.If the object is returned back to where it originated, the original (unknown) data is also returned. Auf diese Weise durchlaufen die Daten ohne Verlust einen Roundtrip zum und vom ursprünglichen Endpunkt.Therefore, the data has made a round trip to and from the originating endpoint without loss. Beachten Sie jedoch, dass der Endpunkt die Änderungen selbst erkennen und umsetzen muss, falls der ursprüngliche Endpunkt eine Verarbeitung der Daten erfordert und diese Voraussetzung nicht erfüllt werden kann.Note, however, that if the originating endpoint required the data to be processed, that expectation is unmet, and the endpoint must somehow detect and accommodate the change.

Der ExtensionDataObject-Typ enthält keine öffentlichen Methoden oder Eigenschaften.The ExtensionDataObject type contains no public methods or properties. Daher kann nicht direkt auf die in der ExtensionData-Eigenschaft gespeicherten Daten zugegriffen werden.Thus, it is impossible to get direct access to the data stored inside the ExtensionData property.

Sie können die Roundtrip-Funktion deaktivieren. Legen Sie hierfür entweder ignoreExtensionDataObject im true-Konstruktor auf DataContractSerializer fest, oder legen Sie die IgnoreExtensionDataObject-Eigenschaft im true auf ServiceBehaviorAttribute fest.The round-tripping feature may be turned off, either by setting ignoreExtensionDataObject to true in the DataContractSerializer constructor or by setting the IgnoreExtensionDataObject property to true on the ServiceBehaviorAttribute. Wenn diese Funktion deaktiviert ist, wird die ExtensionData-Eigenschaft nicht vom Deserialisierungsprogramm gefüllt, und der Inhalt der Eigenschaft wird nicht vom Serialisierungsprogramm ausgegeben.When this feature is off, the deserializer will not populate the ExtensionData property, and the serializer will not emit the contents of the property.

Siehe auchSee Also

IExtensibleDataObject
ExtensionDataObject
Datenvertrags-VersionsverwaltungData Contract Versioning
Bewährte Methoden: Versionsverwaltung von DatenverträgenBest Practices: Data Contract Versioning