我正在使用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"
}
}
}
答案 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。