2013-02-15 59 views
4

我嘗試在我的應用程序中使用DataContractSerializer以實現向後和向前兼容,並支持往返(如果可能)。Howto使用DataContractSerializer忽略未知類型

是否有可能支持往返,如果沒有,是否有可能忽略未知類型在以下情況下?

假設我有一個ClassWithObject類,它具有object類型的屬性,而舊版本的應用程序在此屬性中存儲了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

微軟有一個完整的指南來解決這些與數據合同有關的問題。 退房:https://msdn.microsoft.com/en-us/library/ms731138.aspx

我剛剛意識到你的意思是你改變dataType,而不是簡單地添加/刪除成員。不,您通過爲新類型創建新成員來適當地處理此問題,而不是通過更改現有的成員來處理此問題。更改dataTypes是API的重大更改。

退房什麼變化構成了一個版本變化的API本指南: http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

+0

成員的數據類型只是對象。這是因爲ClassWithObject不知道該對象的類型,它只是存儲該對象。該應用程序的將來版本現在將該對象設置爲新類型。顯然,舊版本沒有[KnownType(typeof(FutureAdditionalData))]集合的屬性並給出SerializationException。 – MTR 2015-03-04 13:59:54