【问题标题】:Who to serialize/deserialize List<Tuple<long, string, int>> using JavaScriptSerializer谁使用 JavaScriptSerializer 序列化/反序列化 List<Tuple<long, string, int>>
【发布时间】:2019-12-16 10:15:45
【问题描述】:

我已经使用 JavaScriptSerializer 序列化了 List&lt;Tuple&lt;long, string, int&gt;&gt; obj

JavaScriptSerializer js = new JavaScriptSerializer();
return js.Serialize(dataToSerialize as IEnumerable); 

我得到了字符串:

[{"Item1":0,"Item2":"UserModifiedId","Item3":1},{"Item1":-1,"Item2":"","Item3":0},{"Item1":-1,"Item2":"","Item3":0}]

当我尝试使用以下方法对其进行反序列化时:

JavaScriptSerializer js = new JavaScriptSerializer();
return js.Deserialize<List<T>>(strObject);

我得到以下例子:

No parameterless constructor defined for type of 'System.Tuple`3[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'.```

Can anyone help me with this Issue (to keep using JavaScriptSerializer)?

【问题讨论】:

  • 不要使用 JavaScriptSerializer。它已经过时了。甚至 ASP.NET Web API 和 2.2 之前的所有 ASP.NET Core 版本都使用 Json.NET。它是 .NET 中事实上的标准 JSON 库。除此之外,还需要在反序列化时指定类型

标签: c# unit-testing javascriptserializer


【解决方案1】:

JavaScriptSerializer 在反序列化过程中需要一个无参数的构造函数来创建对象。

因为Tuple类没有,反序列化失败。

如果你不打扰你可以使用NuGetNewtonsoft.Json,它没有他的问题:

var strObject= JsonConvert.SerializeObject(dataToSerialize);

var tupleList = JsonConvert.DeserializeObject<List<Tuple<long, string, int>>>(strObject);

【讨论】:

  • 是的,我不想使用 Newtonsoft.Json
  • 那你可能得看看DataContractJsonSerializer,因为我担心JavaScriptSerializer在这种情况下不起作用。
  • 谢谢回答
【解决方案2】:

在反序列化时尝试指定确切的类型

JavaScriptSerializer js = new JavaScriptSerializer();
return js.Deserialize<List<Tuple<long, string, int>>>(strObject);

【讨论】:

  • 这仍然存在同样的问题。
  • 我试过了,我得到了同样的例外。 (谢谢回答)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
相关资源
最近更新 更多