我尝试在我的应用程序中使用 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 并原封不动地写出来?