gpt4 book ai didi

c# - 如何使用 DataContractSerializer 忽略未知类型

转载 作者:行者123 更新时间:2023-11-30 13:02:39 25 4
gpt4 key购买 nike

我尝试在我的应用程序中使用 DataContractSerializer,以便向后和向前兼容并支持往返(如果可能)。

是否可以支持往返,或者如果不支持,是否可以在以下场景中忽略未知类型?

假设我有一个 ClassWithObject 类,它有一个对象类型的属性,我的应用程序的旧版本在这个属性中存储了一个 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 有一个完整的指南来解决这些类型的数据契约(Contract)问题。查看:https://msdn.microsoft.com/en-us/library/ms731138.aspx

我刚刚意识到您的意思是更改数据类型,而不是简单地添加/删除成员。不,您可以通过为新类型创建新成员而不是更改现有成员来适本地处理这个问题。更改数据类型是 API 的重大更改。

查看此指南,了解哪些更改构成 API 的版本化更改: http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

关于c# - 如何使用 DataContractSerializer 忽略未知类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14892113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com