繁体   English   中英

wcf将enum反序列化为字符串

[英]wcf deserialize enum as string

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

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

如果你这样做会发生什么

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

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

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

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

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

HttpUtility.UrlEncode(JSONInstruction) /*remember to encode the string*/

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

这可能正在发生,因为setter是私有的,报告的错误是误导性的。 Foo是第一个被反序列化的属性,因为没有公共setter可用它会引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM