我正在尝试使用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,因为在其它许多缺点中,它不会让我在属性上拥有私有的setter。
如何让WCF(或者,DataContractSerializer)将我的枚举视为字符串值?
编辑:这样做似乎是不可能的,行为就是它的设计方式。谢谢微软,不给我们选择,不得不诉诸黑客。按照somori建议的方式这样做似乎是获得带有JSON和WCF的字符串枚举的唯一方法。
答案 0 :(得分:7)
这可能是一个愚蠢的问题。
如果你这样做会怎样?
[DataMember( Name = "foo" )]
private string foo { get; private set; }
public Foo Foo
{
get
{
return Foo.Parse(foo);
}
}
答案 1 :(得分:1)
我知道这是一个老帖子,但我认为值得一提。
我收到了类似的错误,其中json字符串的反序列化失败,似乎反序列化为错误的类型。
对我来说,修复是在将json字符串发送到服务器之前对其进行URL编码。一个简单但容易犯的错误。
HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/
答案 2 :(得分:0)
尔..?枚举不是整数?例外是有效的。如果这有帮助,我不知道:http://msdn.microsoft.com/en-us/library/aa347875.aspx
答案 3 :(得分:-1)
这可能正在发生,因为setter是私有的,并且报告的错误具有误导性。 Foo是第一个被反序列化的属性,因为没有公共setter可用它会引发异常。