【发布时间】:2017-07-01 02:21:54
【问题描述】:
[HttpGet]
public IEnumerable<Facility> AllFacilities()
{
string jsondata = Data.GetFacilities;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerialize();
javaScriptSerializer.MaxJsonLength = int32.MaxValue;
return javaScriptSerializer.Deserialize<List<Facility>>(jsondata);
}
当有大量数据时,反序列化花费的时间太长。有没有办法提高它的性能。喜欢返回一部分数据并在加载其余部分时向用户显示。我的应用程序只是在浏览器页面中显示 xml 格式的输出
我尝试了收益回报。我对此了解不多。我所期待的是“jsondata”中的每个设施记录都被反序列化并被一一返回,以便用户可以在其他人正在加载的同时看到一些东西。但这并没有发生。
[HttpGet]
public IEnumerable<Facility> AllFacilities()
{
string jsondata = Data.GetFacilities;
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.MaxJsonLength = int.MaxValue;
foreach (var x in javaScriptSerializer.Deserialize<List<Facility>(jsondata))
{
yield return x;
}
}
这两个 sn-ps 以相同的方式返回数据。我究竟做错了什么?或者有更好的方法吗?请给我建议。
【问题讨论】:
-
尝试使用JSON.NET,似乎比内置的序列化器效率更高。
-
行
foreach (var x in javaScriptSerializer.Deserialize<List<Facility>>(json))仍在一次对整个 JSON 对象执行反序列化,然后迭代每个结果记录,这就是为什么没有帮助 -
感谢您的回复。我已经尝试过 JSON.NET,但它仅在几秒钟内对性能没有太大帮助。这种反序列化需要几分钟来加载数据。如何在反序列化之前对 jsondata 进行分块?最好的方法是什么?任何想法表示赞赏。
-
查看this stackoverflow answer 看看是否可行。我从未使用过它,所以我只发布评论而不是答案,但看起来你可以在解析每个条目时触发回调。总处理时间可能没有什么不同,但您将能够获取数据并开始使用它,因为它通过 json 字符串运行
-
感谢您的建议。我会试试看,然后告诉你。
标签: c#