JsonConvert.DeserializeObject()抛出StackOverflow异常

时间:2015-03-09 17:48:11

标签: c# json serialization stack-overflow

我正在开发一个托管在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项目,但它仍然有同样的问题反序列化。
  6. 任何帮助都会非常感激,因为我已经尝试了所有我能想到的解决问题的方法。

1 个答案:

答案 0 :(得分:3)

问题似乎与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();