编程语言
首页 > 编程语言> > C#-JsonConvert.DeserializeObject()引发StackOverflow异常

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

作者:互联网

我正在处理一个托管在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