簡體   English   中英

如何使用DataContractSerializer忽略未知類型

[英]Howto ignore unknown types with DataContractSerializer

我嘗試在我的應用程序中使用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中並將其未經修改地寫出來?

Microsoft提供了解決數據合同這類問題的完整指南。 退房: 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM