【问题标题】:Deserialize enum from JSON to C# when object is expected in WCF当 WCF 中需要对象时,将枚举从 JSON 反序列化为 C#
【发布时间】:2015-01-21 08:00:19
【问题描述】:

我在 C# 中有一个过滤器对象,其中包含一个字符串字典(表示属性名称)和相应的值(期望一个对象)。

在将带有 JSON 的自定义类型的对象发送到 WCF 时,我在我的 JSON 中使用 __type 将 JSON 对象正确反序列化为 C# 对象。但是,当发送一个枚举(在 JSON 中表示为整数)时,它将在 C# 中序列化为整数,因为反序列化器无法告诉它所期望的枚举类型。

我发送的 JSON:

{
    "filterList": [
        { "FilterProperty": "Status", "FilterValue": 4 }
        { "FilterProperty": "Status", "FilterValue": 6 }
    ]
}    

它将 DataContract 反序列化为以下列表:

public class Filter
{
        [DataMember]
        public string FilterProperty { get; set; }
        [DataMember]
        public object FilterValue { get; set; }
}

FilterValue 在这种特定情况下对应于枚举。但是因为FilterValue属性被定义为对象,所以反序列化器不知道如何在没有额外信息的情况下对其进行反序列化。

是否可以使用 JSON 发送附加信息以让 WCF 正确反序列化枚举,即使需要一个对象?

或者解决这个问题的唯一方法是使用反射从过滤器属性名称中解析类型?

【问题讨论】:

  • 您在 WCF 服务中使用 DataContracts 吗?如果你只使用字典,很明显序列化器将找不到正确的枚举类型。
  • @rraszewski 我使用 DataContracts,它不是本机字典。 '如果你只使用字典,很明显序列化程序将找不到正确的枚举类型',你到底是什么意思?
  • @Amit 我不想将我的枚举作为字符串发送到线上,这不是问题所在。问题是我将枚举作为整数发送到我的 WCF 服务器,并且我希望它正确反序列化它。但是,服务器不能隐式执行此操作,因为它需要一个对象而不是特定的 Enum 类型。
  • 请用代码示例注释您的问题,以展示您的问题。诸如 Is it possible to send additional information with JSON to let WCF 正确反序列化枚举,即使需要一个对象之类的句子本身并没有多大意义。

标签: c# json wcf enums


【解决方案1】:

不,您无法在 JSON 中嵌入任何额外信息来指示反序列化程序将 object 类型的属性的类型设置为 object 以外的任何值。

如果您需要能够跨 WCF 服务边界多态地支持多种类型,您可以定义一个接口来表示您的类型,在本例中类似于 IFilterValue,然后使用 ServiceKnownType 属性告诉 WCF支持的接口实现。

希望对您有所帮助。

编辑

在我看来,另一个更具互操作性的解决方案是:

public class Filter
{
    [DataMember]
    public string FilterProperty { get; set; }

    [DataMember]
    public string Type { get; set; }

    [DataMember]
    public string FilterValue { get; set; }
}

这意味着您可以进行显式字符串转换,而不是拆箱对象,这让我觉得这是一个更好的选择。

【讨论】:

  • FilterPropery 可以包含对我们域中每个模型的属性的引用。无法为过滤器使用的每种类型定义 ServiceKnownType。
  • 在这种情况下,您别无选择,只能根据 FilterProperty 的设置来重构您的服务合同以删除该属性,或者在稍后的代码中将属性值拆箱。
  • 当您想公开可用于每个类的过滤器对象时,我认为没有其他方法可以使用object :) 但是使用反射来取消包装属性的选项似乎是唯一的选择。
  • 除了 JSON 端点外,该服务还有一个 SOAP 端点,可以正确反序列化。如果我更改 String 中的 FilterValue,SOAP 端点的反序列化将不再起作用。
  • 非常感谢您的努力!
猜你喜欢
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 2013-09-01
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多