C# DataContractJsonSerializer忽略了EnumMemberAttribute值
这是我的代码:C# DataContractJsonSerializer忽略了EnumMemberAttribute值,c#,.net,enums,datacontract,datacontractjsonserializer,C#,.net,Enums,Datacontract,Datacontractjsonserializer,这是我的代码: [DataContract] // (Name = "Type")] public enum Purpose { [EnumMember(Value = "definitionTarget")] DefinitionTarget = 0, [EnumMember(Value = "definitionSource")] DefinitionSource = 1, [EnumMember(Value = "semanticRole")] Se
[DataContract] // (Name = "Type")]
public enum Purpose
{
[EnumMember(Value = "definitionTarget")]
DefinitionTarget = 0,
[EnumMember(Value = "definitionSource")]
DefinitionSource = 1,
[EnumMember(Value = "semanticRole")]
SemanticRole = 2,
[EnumMember(Value = "dataType")]
DataType = 3
}
我希望枚举值根据给定的字符串而不是整数值显示。由于某些原因,这些值被忽略
序列化代码一点也不奇怪:
protected string GetRuntimeValue(RuntimeValue value)
{
MemoryStream ms = new MemoryStream();
_serializer.WriteObject(ms, value);
return System.Text.Encoding.UTF8.GetString(ms.ToArray());
}
我找到了一个示例,其中包含一些样板代码,它们继承了IEExtensibleDataObject(没有解释原因)。我将代码添加到我的基类中,没有任何更改
我做错了什么?应该简单点,不是吗 坏消息是
DataContractJsonSerializer
忽略了EnumMember
属性,这是:
枚举成员值在JSON中被视为数字,即
与数据契约中的处理方式不同,它们在哪里
包含为成员名称。。。EnumMemberAttribute和NonSerializedAttribute属性在使用时将被忽略
一位Microsoft支持代理还建议使用一个kludge来公开一个用DataMember
修饰的属性,以供序列化程序使用,该序列化程序调用Enum.GetName()
来获取枚举值的字符串名
在您的情况下,需要对其进行修改,以返回第一个字母转换为小写的字符串:
[DataContract]
public class RuntimeValue
{
public Purpose Purpose { get; set; }
[DataMember(Name = "Purpose")]
string PurposeString
{
get { return Enum.GetName(typeof(Purpose), this.Purpose).FirstCharacterToLower(); }
set { this.Purpose = (Purpose)Enum.Parse(typeof(Purpose), value, true); }
}
}
使用借用的扩展方法执行小写操作:
public static string FirstCharacterToLower(this string str)
{
if (String.IsNullOrEmpty(str) || Char.IsLower(str, 0))
return str;
return Char.ToLowerInvariant(str[0]) + str.Substring(1);
}
测试:
Console.WriteLine(GetRuntimeValue(new RuntimeValue()));
输出:
{“目的”:“定义目标”}
就我个人而言,如果可能的话,我会使用JSON.NET,但是为了我的回答,我假设您已经考虑过这个选项,并且有很好的理由坚持使用这个序列化程序。非常感谢您!是的,我考虑过JSON.net,但是数据契约机制提供了太多的优势(特别是当涉及到web服务中的多种用途时),所以我无法避免它。令人惊讶的是,他们忽略了自己的属性。