前言
請了一天假后回公司,同事跟我說使用Newtonsoft.json序列化TreeView物件的時候出現報錯;
啊!什么?這個類別庫不是能夠序列化所有東西嗎?真的很懵逼,也是我第一次使用這個類別庫出現問題!
問題例外
- 例外資訊 :
Newtonsoft.Json.JsonSerializationException:“Self referencing loop detected for property 'Owner' with type 'System.Windows.Forms.TreeView'. Path 'AccessibilityObject'.”
看上面的資訊,"自參考回圈檢查到型別為TreeView的Owner屬性.路徑是AccessibilityObject物件"
到這里,我認為最重要的資訊是 自參考 這個問題;
嘗試解決
- 所以我利用Newtonsoft.json提供的設定---忽略自參考屬性
string sjson = Newtonsoft.Json.JsonConvert.SerializeObject(tree, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore });

- 不過寫完后我就后悔了,如果我忽略了TreeView本身的屬性,那我反序列化Json會不會因為Json結構不完整導致報錯呢?

.....所以說到現在還是白忙活,還是說WindowsControl實際上是不應該序列化的吧. T.T,畢竟里面的很多關系封裝成私有欄位處理了,我們在外部完全處理不了!
那就是說,從一開始計劃序列化TreeView實體是走錯路的;
那么換個思路,序列化TreeView只不過想要保存TreeView的Nodes相關的Name/Text/Tag/Checked屬性而已,
因此新思路的基礎上,我打算定義一個物體類來存盤TreeView的資訊:
/// <summary>
/// TreeNode物體類
/// </summary>
public class TreeNodeJson
{
/// <summary>
/// Nodes
/// </summary>
public List<TreeNodeJson> ChildTreeNode { get; set; }
public string Name { get; set; }
public string Text { get; set; }
/// <summary>
/// Tag
/// </summary>
public NodeType TreeNodeType { get; set; }
}
然后寫一個方法遞回TreeView的Node,把資訊存進物體里面,再序列化,就能得到想要的Json字串
,當然反序列化也是沒有問題的!(遞回樹很簡單,就不展示代碼了)
結論
- 到現在問題是已經解決了,可以得知我們不應該使用Newtonsoft.json序列化WindowsControl實體,但如果需要保存該Control的資料時,
那么還是得寫一個相關的物體進行資料操作!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/26973.html
標籤:C#
上一篇:巨坑!
下一篇:關于二叉樹的一些基本知識
