다음을 통해 공유


Forward-Compatible 데이터 계약

WCF(Windows Communication Foundation) 데이터 계약 시스템의 특징은 시간이 지남에 따라 계약이 깨지지 않는 방식으로 발전할 수 있다는 것입니다. 즉, 이전 버전의 데이터 계약을 가진 클라이언트는 동일한 데이터 계약의 최신 버전과 서비스와 통신할 수 있고, 최신 버전의 데이터 계약을 가진 클라이언트는 동일한 데이터 계약의 이전 버전과 통신할 수 있습니다. 자세한 내용은 모범 사례: 데이터 계약 버전 관리를 참조하세요.

기존 데이터 계약의 새 버전이 만들어지면 필요에 따라 대부분의 버전 관리 기능을 적용할 수 있습니다. 그러나 제대로 작동하려면 하나의 버전 관리 기능 인 라운드트립(round-tripping)이 첫 번째 버전의 형식에 기본 제공되어야 합니다.

Round-Tripping

데이터가 새 버전에서 이전 버전으로 전달되고 데이터 계약의 새 버전으로 다시 전달되면 라운드트립이 발생합니다. 라운드트립은 데이터가 손실되지 않음을 보장합니다. 라운드트립을 사용하도록 설정하면 데이터 계약 버전 관리 모델에서 지원하는 향후 변경 내용과 형식이 앞으로 호환됩니다.

특정 형식에 대해 라운드트립을 사용하도록 설정하려면 형식이 인터페이스를 IExtensibleDataObject 구현해야 합니다. 인터페이스에는 하나의 속성인 ExtensionData이 있으며, 이는 ExtensionDataObject 형식을 반환합니다. 이 속성은 현재 버전에서는 알 수 없는 미래 버전의 데이터 계약 데이터를 저장합니다.

예시

다음 데이터 계약은 향후 변경 내용과 호환되지 않습니다.

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

형식이 향후 변경 내용과 호환되도록 하려면(예: "phoneNumber"라는 새 데이터 멤버 추가) 인터페이스를 IExtensibleDataObject 구현합니다.

[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 인프라가 원래 데이터 계약의 일부가 아닌 데이터를 발견하면 데이터는 속성에 저장되고 보존됩니다. 임시 스토리지를 제외한 다른 방법으로 처리되지 않습니다. 개체가 원래 위치로 다시 반환되면 원래(알 수 없는) 데이터도 반환됩니다. 따라서 데이터는 손실 없이 원래 엔드포인트를 왕복합니다. 그러나 원래 엔드포인트에서 데이터를 처리해야 하는 경우 해당 기대는 충족되지 않으며 엔드포인트는 어떻게든 변경 사항을 감지하고 수용해야 합니다.

형식에 ExtensionDataObject public 메서드 또는 속성이 없습니다. 따라서 속성 내에 저장된 데이터에 직접 액세스하는 것은 불가능합니다 ExtensionData .

생성자에서 ignoreExtensionDataObject을(를) true로 설정하거나 DataContractSerializerIgnoreExtensionDataObject 속성을 true로 설정하여 라운드트립 기능을 비활성화할 수 있습니다. 이 기능이 꺼져 있으면 역직렬 변환기가 ExtensionData 속성을 채우지 않고, 직렬 변환기가 속성의 내용을 내보내지 않습니다.

참고하십시오