Контракты данных, совместимые с любыми будущими изменениямиForward-Compatible Data Contracts

Функция системы контрактов данных Windows Communication Foundation (WCF) заключается в том, что контракты могут развиваться с течением времени в неразрывных направлениях.A feature of the Windows Communication Foundation (WCF) data contract system is that contracts can evolve over time in nonbreaking ways. Это значит, что клиент, использующий старую версию контракта данных, может взаимодействовать со службой, использующей новую версию того же контракта данных, или клиент, использующий новую версию контракта данных, может взаимодействовать со службой, использующей старую версию того же контракта данных.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. Дополнительные сведения см. в разделе рекомендации по управлению версиями контракта данных.For more information, see Best Practices: Data Contract Versioning.

Большинство возможностей управления версиями можно применять по мере необходимости при создании новых версий существующего контакта данных.You can apply most of the versioning features on an as-needed basis when new versions of an existing data contract are created. Однако для правильной работы в качестве типа из первой версии должна быть встроена одна функция управления версиями, циклобработки.However, one versioning feature, round-tripping, must be built into the type from the first version in order to work properly.

Полная совместимость версийRound-Tripping

Полная совместимость версий обеспечивается, когда данные передаются от новой версии к старой и снова в новую версию контракта данных.Round-tripping occurs when data passes from a new version to an old version and back to the new version of a data contract. Полная совместимость версий гарантирует сохранение всех данных.Round-tripping guarantees that no data is lost. Включение полной совместимости версий обеспечивает прямую совместимость типа с любыми будущими изменениями, поддерживаемыми моделью управления версиями контрактов данных.Enabling round-tripping makes the type forward-compatible with any future changes supported by the data contract versioning model.

Полная совместимость версий для определенного типа возможна только в том случае, если этот тип реализует интерфейс IExtensibleDataObject.To enable round-tripping for a particular type, the type must implement the IExtensibleDataObject interface. Интерфейс имеет одно свойство: ExtensionData (возвращение типа ExtensionDataObject).The interface contains one property, ExtensionData (returning the ExtensionDataObject type). Это свойство сохраняет любые данные из будущих версий контракта данных, неизвестные в текущей версии.The property stores any data from future versions of the data contract that is unknown to the current version.

ПримерExample

Ниже представлен контракт данных, который не обладает прямой совместимостью с будущими изменениями.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

Чтобы тип был совместим с будущими изменениями (такими как добавление нового члена данных с именем "phoneNumber"), необходимо реализовать интерфейс IExtensibleDataObject.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

Когда инфраструктура WCF обнаруживает данные, не являющиеся частью исходного контракта данных, данные сохраняются в свойстве и сохраняются.When the WCF infrastructure encounters data that is not part of the original data contract, the data is stored in the property and preserved. Обработка данных выполняется только во временном хранилище.It is not processed in any other way except for temporary storage. Если объект возвращается в место создания, также возвращаются исходные (неизвестные) данные.If the object is returned back to where it originated, the original (unknown) data is also returned. Следовательно, данные совершают круговой путь к исходной конечной точке и из нее без потерь.Therefore, the data has made a round trip to and from the originating endpoint without loss. Однако следует помнить, что если в исходной конечной точке необходимо выполнить обработку данных, этого не произойдет, и конечная точка должна будет каким-либо образом обнаружить и применить изменение.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.

Тип ExtensionDataObject не содержит открытых методов или свойств.The ExtensionDataObject type contains no public methods or properties. Таким образом, невозможно получить прямой доступ к данным, хранящимся внутри свойства ExtensionData.Thus, it is impossible to get direct access to the data stored inside the ExtensionData property.

Функцию полной совместимости версий можно отключить, присвоив свойству ignoreExtensionDataObject значение true в конструкторе DataContractSerializer или присвоив свойству IgnoreExtensionDataObject значение true для атрибута ServiceBehaviorAttribute.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. Если эта возможность выключена, десериализатор не будет заполнять свойство ExtensionData, а сериализатор не будет выпускать содержимое свойства.When this feature is off, the deserializer will not populate the ExtensionData property, and the serializer will not emit the contents of the property.

ДополнительноSee also