2013-02-15 6 views
4

내 응용 프로그램에서 DataContractSerializer를 사용하여 이전 버전과의 호환 및 왕복 (가능한 경우) 지원을 시도합니다.DataContractSerializer에서 알 수없는 형식을 무시하는 방법

왕복 여행을 지원할 수 있습니까 아니면 다음 시나리오에서 알 수없는 유형을 무시하는 것이 가능합니까?

개체 유형의 속성을 가진 ClassWithObject 클래스가 있고이 응용 프로그램의 이전 버전이이 속성에 CurrentAdditionalData 유형의 개체를 저장했다고 가정합니다.

[DataContract] 
[KnownType(typeof(CurrentAdditionalData))] 
public class ClassWithObject : IExtensibleDataObject 
{ 
    #region IExtensibleDataObject Members 
    private ExtensionDataObject extensionDataObject_value; 
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
    public ExtensionDataObject ExtensionData 
    { 
     get 
     { 
      return extensionDataObject_value; 
     } 
     set 
     { 
      extensionDataObject_value = value; 
     } 
    } 
    #endregion 

    [DataMember] 
    public object AdditionalData { get; set; } 
} 

[DataContract] 
public class CurrentAdditionalData : IExtensibleDataObject 
{ 
    #region IExtensibleDataObject Members 
    private ExtensionDataObject extensionDataObject_value; 
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
    public ExtensionDataObject ExtensionData 
    { 
     get 
     { 
      return extensionDataObject_value; 
     } 
     set 
     { 
      extensionDataObject_value = value; 
     } 
    } 
    #endregion 

    [DataMember] 
    public int MyProperty { get; set; } 
} 

내 응용 프로그램의 새 버전에서는 CurrentAdditionalData 클래스를 알고 있기 때문에이 파일을로드해도 아무런 문제가 없습니다.

하지만 새 버전에 이전 버전이 알지 못하는 FutureAdditionalData 유형의 객체가 저장되면 어떻게 될까요?

[DataContract] 
public class FutureAdditionalData : IExtensibleDataObject 
{ 
    #region IExtensibleDataObject Members 
    private ExtensionDataObject extensionDataObject_value; 
    [System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
    public ExtensionDataObject ExtensionData 
    { 
     get 
     { 
      return extensionDataObject_value; 
     } 
     set 
     { 
      extensionDataObject_value = value; 
     } 
    } 
    #endregion 

    [DataMember] 
    public string Property1 { get; set; } 
    [DataMember] 
    public float Property2 { get; set; } 
    [DataMember] 
    public double Property3 { get; set; } 
} 

이전 버전이이 파일을 읽으려고하면이 유형을 알지 못하므로 SerializationException이 발생합니다.

알 수없는 유형을 알고 단순히 무시하는 방식으로 이전 버전을 수정할 수 있습니까?

또는 이전 버전에서 파일을 다시 저장하면 알 수없는 개체를 ExtensionData로로드하고 수정하지 않고 작성할 수 있습니까?

답변

0

Microsoft는 데이터 계약을 통해 이러한 종류의 문제를 해결하기위한 전체 가이드를 제공합니다. 체크 아웃 : https://msdn.microsoft.com/en-us/library/ms731138.aspx

방금 ​​회원 추가/제거가 아니라 데이터 유형 변경이라는 의미입니다. 아니요, 기존 유형을 변경하는 것이 아니라 새로운 유형의 새 구성원을 만들어 적절하게 처리합니다. dataTypes 변경은 API의 주요 변경 사항입니다.

체크 아웃하는 API에 대한 버전 변화를 구성하는 어떤 변화에 대한이 안내 : 회원의 데이터 유형은 단순히 객체 http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

+0

합니다. ClassWithObject는 객체가 어떤 유형인지 알지 못하기 때문에 객체를 저장하기 만합니다. 이후 버전의 응용 프로그램은 객체를 새로운 유형으로 설정합니다. 분명히 이전 버전은 [KnownType (typeof (FutureAdditionalData)] 속성이 설정되어 있지 않으며 SerializationException을 제공합니다. – MTR