C# JsonConvert.DeserializeObject()引发堆栈溢出异常

C# JsonConvert.DeserializeObject()引发堆栈溢出异常,c#,json,serialization,stack-overflow,C#,Json,Serialization,Stack Overflow,我正在从事一个托管在Azure上的WebAPI项目,在反序列化我自己序列化的对象时遇到了一些问题。我所做的是将序列化的Json存储在DB中,并在服务上从DB读取该字符串并尝试对其进行反序列化。我得到的确切例外情况如下: An unhandled exception of type 'System.StackOverflowException' occurred in Newtonsoft.Json.dll 我试图反序列化的对象是一个图形数据结构,它具有无向边,在其节点类型定义中使用基类,但接受

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

An unhandled exception of type 'System.StackOverflowException' occurred in Newtonsoft.Json.dll
我试图反序列化的对象是一个图形数据结构,它具有无向边,在其节点类型定义中使用基类,但接受任何派生类的节点。这意味着我必须将默认Json序列化程序设置更改为以下内容:

new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.Objects, TypeNameHandling = TypeNameHandling.Auto }
这使它能够处理由无向边创建的循环引用,从而可以处理类型为的图形

Graph<Intersection>
图形
接受从交叉点派生其类型的任何节点。交集只是一个简单的抽象类,它有两个基类型属性,任何派生类都只添加几个基类型属性

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

An unhandled exception of type 'System.StackOverflowException' occurred in Newtonsoft.Json.dll
  • 尝试在序列化的同一应用程序中反序列化Json 信息技术它成功地反序列化了Json。(图表是 在WPF应用程序中创建)
  • 创建了一个控制台应用程序,其反序列化json的过程与WebAPI项目中的过程完全相同,认为从DB或其他地方读取json可能有问题。但它能够反序列化没有问题
  • 然后,我尝试在WebAPI解决方案中创建类库,并尝试让它对Json进行反序列化,但失败了,出现了相同的StackOverflow异常
  • 我曾尝试将Json.Net二进制文件添加到我的项目中以进行调试,但StackOverflow异常正在代码中抛出,我似乎无法缩小它发生的范围
  • 我认为这可能是Azure和Azure emulator的问题,所以我在本地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();
    
    Thread-Thread=new-Thread(new-ThreadStart(()=>graph=JsonConvert.DeserializeObject(json,GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings)),1000000);
    thread.Start();
    thread.Join();
    
    您编写的
    图形是在WPF应用程序中创建的
    。使用什么JSON序列化程序进行序列化?使用相同的JSON.Net(Newtonsoft)。WPF应用程序中的二进制文件与WebAPI应用程序中的相同(.net45版本6.0.8)序列化的Json有多大?看到这一点会很有趣。在反序列化过程中,您是否使用相同的
    JsonSerializerSettings
    ?事实上,在进行序列化的同一个应用程序中进行反序列化时,它正在工作,这是一个非常清楚的迹象,表明有些事情是不同的!如何定义图形数据类型?它是否在共享DLL中?感谢您的评论,它最终成为IIS的堆栈大小问题。我的Json大于默认IIS堆栈大小所允许的大小。