首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >wcf将枚举反序列化为字符串

wcf将枚举反序列化为字符串
EN

Stack Overflow用户
提问于 2010-01-23 06:29:55
回答 3查看 11.7K关注 0票数 22

我正在尝试使用WCF来使用RESTful web服务。我无法控制web服务的格式,因此我必须在这里和那里做一些变通。然而,我似乎无法绕过的一个主要问题是,如何让WCF将枚举反序列化为字符串。

这是我的代码(很明显,名字已经改了):

代码语言:javascript
复制
[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; }
}

这是未通过反序列化的返回数据:

代码语言:javascript
复制
{
     "id":123456,
     "name":"John Doe",
     "foo":"bar"
}

最后,抛出异常:

反序列化类型为Service.Foo的对象时出错。值'bar‘不能被分析为类型'Int64’。

我不想切换到使用XmlSerializer,因为在它的许多缺点中,它不允许我在属性上有私有的setter。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-28 05:46:55

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

如果你这样做了会发生什么?

代码语言:javascript
复制
[DataMember( Name = "foo" )]
private string foo { get; private set; }

public Foo Foo 
{ 
  get 
  {
    return Foo.Parse(foo);
  }
}
票数 8
EN

Stack Overflow用户

发布于 2011-07-01 15:54:27

我知道这是一个古老的帖子,但我认为它值得一提。

我收到了一个类似的错误,json字符串的反序列化失败,似乎反序列化成了错误的类型。

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

代码语言:javascript
复制
HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/
票数 1
EN

Stack Overflow用户

发布于 2010-01-23 09:36:03

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2121010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档