wcf将enum反序列化为字符串

Ale*_*lex 20 .net c# wcf enums datacontractserializer

我正在尝试使用WCF使用RESTful Web服务.我无法控制Web服务的格式,所以我必须在这里和那里做一些解决方法.然而,我似乎无法解决的一个主要问题是如何使WCF将枚举反序列化为字符串.

这是我的代码(显然名称已更改):

[DataContract]
public enum Foo
{
    [EnumMember( Value = "bar" )]
    Bar,

    [EnumMember( Value = "baz" )]
    Baz
}

[DataContract]
public class UNameIt
{
    [DataMember( Name = "id" )]
    public long Id { get; private set; }

    [DataMember( Name = "name" )]
    public string Name { get; private set; }

    [DataMember( Name = "foo" )]
    public Foo Foo { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

这是反序列化失败的返回数据:

{
     "id":123456,
     "name":"John Doe",
     "foo":"bar"
}
Run Code Online (Sandbox Code Playgroud)

最后,抛出异常:

反序列化Service.Foo类型的对象时出错.值'bar'无法解析为'Int64'类型.

我不想切换到使用XmlSerializer,因为在它的许多其他缺点中,它不会让我在属性上拥有私有的setter.

如何使WCF(或者,DataContractSerializer)将我的枚举视为字符串值?

编辑:这似乎是不可能的,行为是它的设计方式.谢谢微软,不给我们选择,不得不诉诸黑客.按照somori建议的方式这样做似乎是获得带有JSON和WCF的字符串枚举的唯一方法.

Sim*_*ill 7

这可能是一个愚蠢的问题.

如果你这样做会发生什么

[DataMember( Name = "foo" )]
private string foo { get; private set; }

public Foo Foo 
{ 
  get 
  {
    return Foo.Parse(foo);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我已经尝试过,这样做有效,但它是一个黑客,如果可以避免,我想避免它. (3认同)