如何配置 ServiceStack.Text 在反序列化时使用 EnumMember?

How to configure ServiceStack.Text to use EnumMember when deserializing?

我正在使用 ServiceStack.Text 反序列化 json 在对对象 C# 的其余 api 调用中接收到的。我使用的模型 类 使用 EnumMember attributes. The problem is that ServiceStack.Text does not seem to use those values. ServiceStack.Text documentation 定义了字符串表示形式,其中有一个名为 Custom enum serialization 的部分讨论了 EnumMember 属性,但它只讨论了没有序列化的问题提到反序列化。

可以配置 ServiceStack.Text 在反序列化枚举时使用 EnumMember 吗?

以下情况举例:

namespace TestNameSpace
{
    using System;
    using System.Runtime.Serialization;

    class TestClass
    {
        enum TestEnum
        {
            [EnumMember(Value = "default_value")]
            DefaultValue = 0,

            [EnumMember(Value = "real_value")]
            RealValue = 1
        }

        class TestEnumWrapper
        {
            public TestEnum EnumProperty { get; set; }

            public override string ToString()
            {
                return $"EnumProperty: {EnumProperty}";
            }
        }

        static void Main(string[] args)
        {
            string json = @"{ ""enumProperty"": ""real_value"" }";

            TestEnumWrapper deserialized =
                ServiceStack.Text.JsonSerializer.DeserializeFromString<TestEnumWrapper>(json);

            Console.WriteLine($"Deserialized: {deserialized}");
           // Prints: "Deserialized: EnumProperty: DefaultValue"
           // Expected: "Deserialized: EnumProperty: RealValue"
        }
    }
}

仅在此版本中添加了对 [EnumMember] 的支持,因此您需要升级到 v5.1.1 pre-release NuGet packages on MyGet

我发现了为什么我的反序列化不起作用。 ServiceStack.Text 没有解释 EnumMember 属性,因为枚举声明没有设置 DataContract 属性。这实际上在 EnumMember 文档中进行了解释 link 我也 link 在问题中编辑:

One way to use enumeration types in the data contract model is to apply the DataContractAttribute attribute to the type. You must then apply the EnumMemberAttribute attribute to each member that must be included in the data contract.

通过添加缺少的属性产生了预期的结果:

[DataContract] // This was missing
enum TestEnum
{ 
    // ...
}