22

我正在尝试使用 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; }
}

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

{
     "id":123456,
     "name":"John Doe",
     "foo":"bar"
}

最后抛出异常:

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

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

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

编辑:这样做似乎是不可能的,并且行为是设计的方式。感谢微软,没有给我们选择,不得不求助于黑客。按照 somori 建议的方式进行操作似乎是使用 JSON 和 WCF 获取字符串枚举的唯一方法。

4

3 回答 3

8

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

如果你这样做会发生什么

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

public Foo Foo 
{ 
  get 
  {
    return Foo.Parse(foo);
  }
}

?

于 2010-01-27T21:46:54.723 回答
1

我知道这是一篇旧文章,但我认为值得一提。

我收到了类似的错误,其中 json 字符串的反序列化失败,似乎反序列化为错误的类型。

对我来说,解决方法是在将 json 字符串发送到服务器之前对其进行简单的 URL 编码。一个简单但容易犯的错误。

HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/
于 2011-07-01T07:54:26.807 回答
0

呃..?枚举不是整数吗?例外是有效的。我不知道这是否有帮助:http: //msdn.microsoft.com/en-us/library/aa347875.aspx

于 2010-01-23T01:36:02.973 回答