Contratos de datos compatibles con el reenvíoForward-Compatible Data Contracts

Una característica de la Windows Communication Foundation (WCF) es el sistema de contrato de datos que los contratos puede evolucionar con el tiempo sin causar interrupciones.A feature of the Windows Communication Foundation (WCF) data contract system is that contracts can evolve over time in nonbreaking ways. Es decir, un cliente con una versión anterior de un contrato de datos puede comunicarse con un servicio con una versión más reciente del mismo contrato de datos, o un cliente con una versión más reciente de un contrato de datos puede comunicarse con una versión anterior del mismo contrato de datos.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. Para obtener más información, consulte prácticas recomendadas: Control de versiones de contratos de datos.For more information, see Best Practices: Data Contract Versioning.

Puede aplicar la mayoría de las características del control de versiones en la medida que se necesite cuando se crean las nuevas versiones de un contrato del dato existente.You can apply most of the versioning features on an as-needed basis when new versions of an existing data contract are created. Sin embargo, una característica de control de versiones, round-tripping, debe estar integrado en el tipo de la primera versión para que funcione correctamente.However, one versioning feature, round-tripping, must be built into the type from the first version in order to work properly.

Round-Tripping (recorrido de ida y vuelta)Round-Tripping

Round-tripping tiene lugar cuando los datos pasan de una nueva versión a una versión anterior y de vuelta a la nueva versión de un contrato de datos.Round-tripping occurs when data passes from a new version to an old version and back to the new version of a data contract. El round-tripping garantiza que no se pierdan datos.Round-tripping guarantees that no data is lost. Habilitar el round-tripping hace que el tipo sea compatible por adelantado con cualquier cambio futuro admitido por el modelo de control de versiones del contrato de datos.Enabling round-tripping makes the type forward-compatible with any future changes supported by the data contract versioning model.

Para habilitar el round-tripping para un tipo determinado, el tipo debe implementar la interfaz IExtensibleDataObject.To enable round-tripping for a particular type, the type must implement the IExtensibleDataObject interface. La interfaz contiene una propiedad, ExtensionData (que devuelve el tipo ExtensionDataObject ).The interface contains one property, ExtensionData (returning the ExtensionDataObject type). La propiedad almacena cualquier dato de las versiones futuras del contrato de datos que es desconocido para la versión actual.The property stores any data from future versions of the data contract that is unknown to the current version.

EjemploExample

El siguiente contrato de datos no compatible por adelantado con los cambios futuros.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 

Para hacer que el tipo sea compatible con los cambios futuros (como agregar un nuevo miembro de datos denominado "phoneNumber"), implemente la interfaz 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 

Cuando la infraestructura de WCF encuentra datos que no forman parte del contrato de datos original, los datos se almacena en la propiedad y se conserva.When the WCF infrastructure encounters data that is not part of the original data contract, the data is stored in the property and preserved. No se procesa para nada más, salvo para el almacenamiento temporal.It is not processed in any other way except for temporary storage. Si el objeto se devuelve a donde se originó, se devuelven también los datos originales (desconocidos).If the object is returned back to where it originated, the original (unknown) data is also returned. Por consiguiente, los datos han realizado un viaje de ida y vuelta (round trip) hasta y desde el extremo de origen sin sufrir pérdidas.Therefore, the data has made a round trip to and from the originating endpoint without loss. Tenga en cuenta, sin embargo, que si el punto de conexión de origen exigiera que se procesasen los datos, la expectativa no se cumple, y el punto de conexión debe detectar y adaptar el cambio de algún modo.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.

El tipo ExtensionDataObject no contiene ningún método público ni propiedades.The ExtensionDataObject type contains no public methods or properties. Por tanto, es imposible obtener acceso directo a los datos almacenados dentro de la propiedad ExtensionData.Thus, it is impossible to get direct access to the data stored inside the ExtensionData property.

La característica de round-tripping puede desactivarse, estableciendo ignoreExtensionDataObject en true en el constructor DataContractSerializer o estableciendo la propiedad IgnoreExtensionDataObject en true en el 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. Cuando esta característica está deshabilitada, el deserializador no rellenará la propiedad ExtensionData y el serializador no emitirá el contenido de la propiedad.When this feature is off, the deserializer will not populate the ExtensionData property, and the serializer will not emit the contents of the property.

Vea tambiénSee also