前言 請了一天假後回公司,同事跟我說使用Newtonsoft.json序列化TreeView對象的時候出現報錯; 啊!什麼?這個類庫不是能夠序列化所有東西嗎?真的很懵逼,也是我第一次使用這個類庫出現問題! 問題異常 異常信息 : Newtonsoft.Json.JsonSerializationEx ...
前言
請了一天假後回公司,同事跟我說使用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的數據時,
那麼還是得寫一個相關的實體進行數據操作!