如果无法使用 DataContractSerializer 反序列化密钥,则跳过字典条目

Posted

技术标签:

【中文标题】如果无法使用 DataContractSerializer 反序列化密钥,则跳过字典条目【英文标题】:Skip Dictionary entry if key cannot be deserialized with DataContractSerializer 【发布时间】:2022-01-13 12:36:59 【问题描述】:

我目前正在序列化一个包含这样的字典的类:

    [DataMember]
    public Dictionary<SomeEnum, SomeData<long>> SomeDictionary = new Dictionary<SomeEnum, SomeData<long>>();

这很好,但将来我可能想从枚举中删除一个值。目前,如果我删除枚举值,我将无法再反序列化数据。如果无法反序列化密钥,如何指示 DataContractSerializer 跳过字典条目?

【问题讨论】:

【参考方案1】:

通过更改枚举,您正在更改合同 - 不是一个好习惯 (Change enum change contract)

如果你想继续,你必须实现自定义序列化(例如Custom JSON Serialization of enum)并使用.Net类型Enum支持方法IsDefined()的事实...

enum myEnum  ev1, ev3 ;
:
:    
Console.WriteLine($"Enum.IsDefined(typeof(myEnum), "ev1") Enum.IsDefined(typeof(myEnum), "ev2")");

给予

True False

【讨论】:

以上是关于如果无法使用 DataContractSerializer 反序列化密钥,则跳过字典条目的主要内容,如果未能解决你的问题,请参考以下文章

如果包含特殊符号,Linux 命令无法使用 java

如果没有GPS,则无法使用navigator.geolocation进行反应原生的当前位置

如果无法使用 Javascript/jQuery 加载视频,则隐藏视频容器

MirageJs:如果我通过直通调用 api,则无法使用 axios

如果使用 document.write,则无法以编程方式插入 js

如果从抽象类派生,则无法使用具体类指针调用函数