我嘗試在我的應用程序中使用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中並將其寫出未修改?
成員的數據類型只是對象。這是因爲ClassWithObject不知道該對象的類型,它只是存儲該對象。該應用程序的將來版本現在將該對象設置爲新類型。顯然,舊版本沒有[KnownType(typeof(FutureAdditionalData))]集合的屬性並給出SerializationException。 – MTR 2015-03-04 13:59:54