我正在使用 ServiceStack.Text 反序列化在对 C# 对象的 REST API 调用中收到的 json。我使用的模型类已经使用定义了字符串表示形式枚举成员属性。问题是 ServiceStack.Text 似乎没有使用这些值。 ServiceStack.Text文档有一个名为自定义枚举序列化讨论了 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"
}
}
}
我发现为什么我的反序列化不起作用。 ServiceStack.Text 没有解释枚举成员属性,因为枚举声明没有设置 DataContract 属性。这实际上在枚举成员我还在问题中链接了文档链接:
在数据协定模型中使用枚举类型的一种方法是将 DataContractAttribute 属性应用于该类型。然后,您必须将 EnumMemberAttribute 属性应用于必须包含在数据协定中的每个成员。
通过添加缺失的属性产生了预期的结果:
[DataContract] // This was missing
enum TestEnum
{
// ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)