關於Newtonsoft.json使用JsonConvert.SerializeObject(TreeView)序列化對象時失敗


前言

請了一天假后回公司,同事跟我說使用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的數據時,
    那么還是得寫一個相關的實體進行數據操作!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM