一种序列化方法会产生内存不足错误,另一种则不会

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

【讨论】:

以上是关于一种序列化方法会产生内存不足错误,另一种则不会的主要内容,如果未能解决你的问题,请参考以下文章

Phalcon框架的编译安装 内存不足的解决办法

系统错误8:存储空间不足,无法处理此命令.怎么办

为什么一个代码会产生内存泄漏而另一个代码却没有?

Spark 流式接收器内存不足 (OOM)

序列化的本质

将sql查询存储在列表中时PHP内存耗尽