簡體   English   中英

JsonConvert.DeserializeObject()拋出StackOverflow異常

[英]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只是一個簡單的抽象類,它有一些基類型屬性,任何派生類只添加一些基類型屬性。

我到目前為止所做的調試步驟如下:

  1. 嘗試在序列化它的同一個應用程序中反序列化Json。 它成功地能夠反序化Json。 (該圖是在WPF應用程序中創建的)
  2. 創建了一個控制台應用程序,它完成了與在WebAPI項目中反序列化json完全相同的過程,認為從DB或其他東西讀取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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM