.NET字典序列化/反序列化差异

时间:2018-04-20 06:12:08

标签: c# .net wcf dictionary .net-core

在将Dictionary从.NET标准WCF Web服务转移到.NET Core 2.0客户端(使用Newtonsoft Json)时,我偶然发现了一个差异。

服务器侧

服务界面如下:

[ServiceContract]
public interface ISomeService
{
  [OperationContract]
  [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
  SomeClass SomeWebMethod();
}

服务器端类如下:

[DataContract]
public class SomeClass
{
  [DataMember]
  public Dictionary<string, string> SomeDictionary { get; set; }
}

这会产生以下JSON响应:

{
  "SomeDictionary": [
    {
      "Key": "some key",
      "Value": "some value"
    },
    {
      "Key": "some other key",
      "Value": "some other value"
    }
  ]
}

注意:WCF服务以Dictionary - Key方式序列化了Value

客户端

客户端类如下:

public class SomeClass {
  public Dictionary<string, string> SomeDictionary { get; set; }
}

因此,服务器端和客户端类都是相同的(除了客户端缺少属性)。

但是,Web服务调用会产生以下错误:

  

“DeserializeResponse”失败了   “Newtonsoft.Json.JsonSerializationException:无法反序列化   当前的JSON数组(例如[1,2,3])成类型   “System.Collections.Generic.Dictionary`2   因为类型需要一个JSON对象(例如 {“name”:“value”} )   正确地反序列化。

注意:客户端希望以Dictionary - name方式传递value,这明显不同于服务器发送的方式 - 因此错误。

使用以下代码片段“手动”完成反序列化:

var obj = JsonConvert.DeserializeObject<SomeClass>(json);

如您所见,我在客户端类上没有任何属性,并且在执行反序列化时仅使用默认选项。

问题

如何统一Dictionary的(反)序列化?我可以在服务器端或客户端进行更改。

我能想到的唯一选择是彻底抛弃Dictionary并在两端制作List - Key个自定义{。}}。

0 个答案:

没有答案