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服务中的多种用途时),所以我无法避免它。令人惊讶的是,他们忽略了自己的属性。