繁体   English   中英

JsonConvert.DeserializeObject()抛出StackOverflow异常

[英]JsonConvert.DeserializeObject() throws StackOverflow exception

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

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

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

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

这使它能够处理由无向边创建的循环引用,因此它可以处理Graph类型

Graph<Intersection>

接受从交叉点派生类型的任何节点。 Intersection只是一个简单的抽象类,它有一些基类型属性,任何派生类只添加一些基类型属性。

我到目前为止所做的调试步骤如下:

  1. 尝试在序列化它的同一个应用程序中反序列化Json。 它成功地能够反序化Json。 (该图是在WPF应用程序中创建的)
  2. 创建了一个控制台应用程序,它完成了与在WebAPI项目中反序列化json完全相同的过程,认为从DB或其他东西读取Json可能是个问题。 但它能够反序列化没有问题。
  3. 然后,我尝试在WebAPI解决方案中创建一个类库,并尝试对Json进行反序列化,但它失败并出现相同的StackOverflow异常。
  4. 我已经尝试将Json.Net二进制文件添加到我的项目中以通过它进行调试但是StackOverflow异常被抛出到整个代码中,我似乎无法缩小它发生的位置。
  5. 我认为这可能是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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM