ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#-JsonConvert.DeserializeObject()引发StackOverflow异常

2019-11-20 17:09:37  阅读:819  来源: 互联网

标签:stack-overflow serialization json c


我正在处理一个托管在Azure上的WebAPI项目,并且遇到了一些反序列化我自己序列化的对象的问题.我正在做的是将序列化的Json存储在数据库中,并在服务中从数据库读取该字符串并尝试反序列化.我得到的确切异常如下:

An unhandled exception of type 'System.StackOverflowException' occurred in Newtonsoft.Json.dll

我要反序列化的对象是一种Graph数据结构,该结构具有无方向的边,并在其节点类型定义中使用基类,但接受任何派生类的节点.这意味着我必须将默认的Json序列化程序设置更改为以下内容:

new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.Auto }

这使它能够处理由无向边创建的循环引用,从而可以处理图类型为

Graph<Intersection>

接受任何从Intersection派生其类型的节点. Intersection只是一个简单的抽象类,它具有几个基本类型属性,任何派生类仅添加了几个基本类型属性.

到目前为止,我已采取的调试步骤如下:

>尝试在序列化的同一应用程序中反序列化Json
它.它能够成功反序列化Json. (图为
在WPF应用程序中创建)
>创建了一个控制台应用程序,该应用程序执行与WebAPI项目中的反序列化JSON完全相同的过程,认为这可能是从数据库或其他内容读取Json的问题.但是它能够反序列化没有问题.
>然后,我尝试在WebAPI解决方案中创建一个类库,并尝试使其反序列化Json,但由于相同的StackOverflow异常而失败.
>我尝试将Json.Net二进制文件添加到我的项目中以对其进行调试,但是整个代码都抛出了StackOverflow异常,我似乎无法缩小其发生位置.
>我认为这可能是Azure和Azure模拟器的问题,因此我在本地IIS上运行了WebAPI项目,但是反序列化仍然存在相同的问题.

由于我已尽力解决该问题,因此将不胜感激.

解决方法:

问题似乎出在IIS具有的默认堆栈的大小附近,小于我的Json文件的大小.这就是为什么我没有在其他任何应用程序中都获得stackoverflow异常的原因,因为它们的堆栈要大得多.

解决方案是在下一行中运行代码,该代码在具有更大堆栈的新线程上运行Json反序列化.

Thread thread = new Thread(new ThreadStart(() => graph = JsonConvert.DeserializeObject<Graph<Intersection>>(json, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings)), 1000000);
thread.Start();
thread.Join();

标签:stack-overflow,serialization,json,c
来源: https://codeday.me/bug/20191120/2045446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有