gpt4 book ai didi

c# - JsonConvert.DeserializeObject() 抛出 StackOverflow 异常

转载 作者:行者123 更新时间:2023-11-30 15:26:40 25 4
gpt4 key购买 nike

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

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

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

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

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

Graph<Intersection>

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

目前我的调试步骤如下:

  1. 尝试在序列化的同一个应用程序中反序列化 Json它。它成功地反序列化了 Json。 (图表是在 WPF 应用程序中创建)
  2. 创建了一个控制台应用程序,它执行与 WebAPI 项目中完全相同的反序列化 json 的过程,认为这可能是从数据库或其他地方读取 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();

关于c# - JsonConvert.DeserializeObject() 抛出 StackOverflow 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28948533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com