序列化为 JSON 字符串时如何修复 OutOfMemoryException?
Posted
技术标签:
【中文标题】序列化为 JSON 字符串时如何修复 OutOfMemoryException?【英文标题】:How to fix OutOfMemoryException when serializing to JSON string? 【发布时间】:2014-08-27 13:34:51 【问题描述】:我有一个 Class 对象,其中包含一个作为字节数组的属性。此类是我的 REST 服务的数据协定。字节数组属性将采用最大大小限制为 500MB 的任何文档。当我尝试使用此服务并序列化对象时,我遇到了 Memory Out of exception 错误。请找到下图
下面是代码sn-p
public static string SerializeJSon<T>(T t)
MemoryStream stream = new MemoryStream();
DataContractJsonSerializer ds = new DataContractJsonSerializer(typeof(T));
DataContractJsonSerializerSettings s = new DataContractJsonSerializerSettings();
DateTimeFormat dt = new DateTimeFormat("MM/dd/yyyy");
s.DateTimeFormat = dt;
**ds.WriteObject(stream, t);**
string jsonString = Encoding.UTF8.GetString(stream.ToArray());
stream.Close();
return jsonString;
【问题讨论】:
将您的代码和异常发布为文本,而不是图像。 这就是图片中显示的内容。 @HemantKumar:将代码粘贴为文本将有助于人们复制它,而不是全部写出来以帮助您。 您可以使用多少物理内存?您的操作系统类型是什么? 另一方面,您根本没有使用DataContractJsonSerializerSettings
对象
【参考方案1】:
尝试“不要在 Web 服务调用中使用 500mb 的文档”。 THs 是核心问题 - 您尝试使用方法调用机制来传输半 GB 的数据,这些数据可能会变成一些 GB 的内存对象。这不是 Web 服务的设计目的。
【讨论】:
这种场景应用怎么做? 什么应用场景?需要传输大量数据的糟糕数据设计?聘请有能力的程序员来设计一个好的数据。 在某处上传数据并将上传数据的 URL 发送到 REST 方法。例如,Microsoft Azure Blob 服务或类似服务。 或者把它切成小块。我完全看不到任何将 500mb 作为 Web 服务请求发送的场景有任何意义。 如果我们知道他试图上传这些数据的原因,我们会提出更具体的建议。以上是关于序列化为 JSON 字符串时如何修复 OutOfMemoryException?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON-B 将 JSON 字符串反序列化为非公共类?
如何覆盖属性的 JSON 序列化,将值序列化为字符串而不是对象?