![](/img/trans.png)
[英]JsonConvert.DeserializeObject<DataTable> throws an exception
[英]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只是一个简单的抽象类,它有一些基类型属性,任何派生类只添加一些基类型属性。
我到目前为止所做的调试步骤如下:
任何帮助将不胜感激,因为我已经尝试了所有我能想到的解决问题的方法。
该问题似乎与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.