一种序列化方法会产生内存不足错误,另一种则不会
Posted
技术标签:
【中文标题】一种序列化方法会产生内存不足错误,另一种则不会【英文标题】:One Serialization method produces Out of Memory error the other dose not 【发布时间】:2019-11-19 12:17:04 【问题描述】:仅在非常大的集合上,以下行在服务器级别的 mscorlib.dll 处引发 OutofMemroyException
HttpResponseMessage response;
response.Content= new StringContent(JsonConvert.SerializeObject(results),
system.Encoding.UTF8, "text/json");
但是以下序列化同一对象的方法不会产生此错误
Var serializer= new System.Web.Script.Serilaization.javascriptSerializer()
MaxJsonLength = int.MaxValue;
response.Content= new StringContent(serializer.Serialize(results),
system.Encoding.UTF8, "text/json")
但是使用第二种方法,客户端会抛出错误:
无法反序列化当前的 json 数组,因为该类型需要 json 对象
所以我希望要么用第一种方法解决内存问题,要么弄清楚为什么第二种方法可以像第一种方法一样反序列化
谢谢
【问题讨论】:
关于客户端代码的更多细节?我的猜测是,如果第一种方法内存不足,那么第二种方法可能会返回一个截断的 JSON 字符串,客户端无法反序列化,因为它不完整。 适用于 JsonConvert.SerializeObject 方法和较小数据集的客户端代码:var response = await GetData(client, query);
var resultSet = await response.Content.ReadAsAsync<DataQuery>();
private async Task<HttpResponseMessage> GetData(HttpClient client, DataQuery query)
var response = await client.PostAsJsonAsync(Settings.Default.Uri + @"/cmd", query);
response.EnsureSuccessStatusCode();
return response;
@987654330跨度>
【参考方案1】:
您希望将大量数据流式传输到客户端,这样您就不会尝试将整个数据保存在服务器上的内存中,这就是您的示例中发生的情况。
这是一篇关于如何使用 JsonTextWriter 和 JsonSerializer 直接写入响应流的好帖子,这将最大限度地减少内存占用。
http://www.bizcoder.com/returning-raw-json-content-from-asp-net-web-api
【讨论】:
以上是关于一种序列化方法会产生内存不足错误,另一种则不会的主要内容,如果未能解决你的问题,请参考以下文章