序列化为 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# 匿名类型序列化为 JSON 字符串?

如何使用 JSON-B 将 JSON 字符串反序列化为非公共类?

如何将字符串序列化为 JSON 并按其中一个值分组?

如何覆盖属性的 JSON 序列化,将值序列化为字符串而不是对象?

如何在 .NET Core 中将 JSON 序列化为没有转义字符的字符串?

如何将form内的表单序列化为json字符串