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

Skip Dictionary entry if key cannot be deserialized with DataContractSerializer

我目前正在序列化一个 class,其中包含这样的字典:

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

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

更改枚举就是更改合同 - 这不是一个好的做法 (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