代码之家  ›  专栏  ›  技术社区  ›  Alex

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

  •  20
  • Alex  · 技术社区  · 16 年前

    我正在尝试使用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的字符串枚举的唯一方法。

    4 回复  |  直到 14 年前
        1
  •  7
  •   Simon Gill    16 年前

    这可能是个愚蠢的问题。

    如果你这样做会怎么样

    [DataMember( Name = "foo" )]
    private string foo { get; private set; }
    
    public Foo Foo 
    { 
      get 
      {
        return Foo.Parse(foo);
      }
    }
    

    ?

        2
  •  1
  •   MHALottering    15 年前

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

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

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

    HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/
    
        3
  •  0
  •   user220583    16 年前

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

        4
  •  -1
  •   timmi4sa    14 年前

    这可能是因为setter是私有的,并且报告的错误具有误导性。foo是第一个要反序列化的属性,由于没有可用的公共setter,它抛出了一个异常。