我正在开发一个托管在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 }
这使它能够处理由无向边创建的循环引用,因此它可以处理类型为
的GraphGraph<Intersection>
接受从交叉点派生类型的任何节点。 Intersection只是一个简单的抽象类,它有一些基类型属性,而任何派生类只添加了一些基类型属性。
到目前为止,我所采取的调试步骤如下:
任何帮助都会非常感激,因为我已经尝试了所有我能想到的解决问题的方法。
答案 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();