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

时间:2018-08-15 07:36:22

标签: .net json servicestack datacontract servicestack-text

我正在使用ServiceStack.Text反序列化在对对象C#的rest api调用中收到的json。我使用的模型类已使用EnumMember属性定义了字符串表示形式。问题在于ServiceStack.Text似乎没有使用这些值。 ServiceStack.Text documentation有一个名为自定义枚举序列化的部分,该部分讨论了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"
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我发现为什么反序列化无法正常工作。 ServiceStack.Text没有解释 EnumMember 属性,因为枚举声明没有设置DataContract属性。实际上,我也在问题中链接的 EnumMember 文档链接中对此进行了解释:

  

在数据协定模型中使用枚举类型的一种方法是将DataContractAttribute属性应用于该类型。然后,必须将EnumMemberAttribute属性应用于必须包含在数据协定中的每个成员。

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

select ... as translation from `Table` as a inner join `Table` as b on a.ID = ? and b.Source = ? and not b.Translation = ?;

答案 1 :(得分:0)

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