我尝试在我的应用程序中使用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