DataContractSerializer 处理反序列化期间丢失的枚举值

问题描述 投票:0回答:1

有什么方法可以在字符串枚举值反序列化期间处理丢失的枚举值。

我最初认为 Json.Net 和 StringEnumConverter 默认用于此转换,并编写了一个可以转换缺失值的子类,但从检查堆栈跟踪来看,似乎正在使用 EnumDataContract.ReadEnumValue。

如果枚举定义发生变化,我希望能够根据具体情况处理该值应反序列化的值。

例如,我希望能够指定一个在失败时使用的字典,而不是因为 ConditionType 的更改而收到以下预期错误,即

{"TestComplete":ConditionType.InvalidValue}

UnhandledException caught (SerializationException): Invalid enum value 'TestComplete' cannot be deserialized into type 'ConditionType'. Ensure that the necessary enum values are present and are marked with EnumMemberAttribute attribute if the type has DataContractAttribute attribute.

有关如何实现此目的的任何指示,或者如何挂钩/覆盖 EnumDataContract

我的枚举成员标记如下。

[DataMember]
public ConditionType Type { get; set; }

我确实找到了一个相关问题,但它并没有真正的答案。

c# enums datacontractserializer datacontract
1个回答
0
投票

几乎知道你的错误在哪里,但是不幸的是,你没有显示带有该错误的代码示例。让我们执行以下操作:我将向您展示一个完整的工作代码示例,以便您可以比较缺少的内容。

但我从经验中知道,这里最典型的错误是不正确的

enum
定义:缺少或不正确的
DataContract
属性、缺少
[EnumMember]
属性,或两者兼而有之。由于某种原因,你没有表现出来。啊,是的,从你的异常信息中我可以看到缺少
[EnumMember]
。好的,这解释了你的问题。

您想检查一下吗?请参阅:

namespace DataContracts {
using System.Runtime.Serialization;
using FileStream = System.IO.FileStream;
using FileMode = System.IO.FileMode;

static class DefinitionSet {
    internal const string dataContractNamespace = "https/www.my.site.org/contracts/demo";
    internal const string filename = "demo.xml";
} //DefinitionSet

[DataContract(Namespace = DefinitionSet.dataContractNamespace)]
enum ConditionType {
    [EnumMember] Excellent, [EnumMember] Good,
    [EnumMember] Fair, [EnumMember] Bad,
    [EnumMember] StackOverflowQuestion, }

[DataContract(Namespace = DefinitionSet.dataContractNamespace)]
class Demo {
    [DataMember] // doesn't have to be public
    public ConditionType Type { get; set; }
}

static class DataContractDemo {

    static void TestSerialization() {
        DataContractSerializer dcs = new(typeof(Demo));
        dcs.WriteObject(new FileStream(
            DefinitionSet.filename,
            FileMode.Create),
                new Demo());
    } //TestSerialization

    static void Main() {
        TestSerialization();
    } //Main

} //class DataContractDemo

}

因此,请确保修正您的

enum
定义。除非您在其他数据协定类型或成员定义中存在错误,否则它应该可以解决您的问题。如果它解决了您的问题,请告诉我们并接受答案,除非您还有其他问题或进一步的问题。

© www.soinside.com 2019 - 2024. All rights reserved.