最近在 StackOverFlow 解答一個很有趣的問題Json.Net / Newtonsoft: Using JsonConvert.SerializeObject results in weird .Equals calls - why?
問題簡述是: 使用Newtonsoft.Json.JsonConvert.SerializeObject
方法 來把物件轉成JSON
資料時,為什麼會呼叫物件的Equals
方法 且傳入的object obj
類型不是此類別類型,而是屬性的類型
以下是發問者提供的程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class JsonTestClass { public string Name { get ; set ; } public List<int > MyIntList { get ; set ; } public override bool Equals (object obj ) { if (obj == null ) return false ; JsonTestClass jtc = (JsonTestClass)obj; return true ; } } JsonTestClass c = new JsonTestClass(); c.Name = "test" ; c.MyIntList = new List<int >(); c.MyIntList.Add(1 ); string json = JsonConvert.SerializeObject(c, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
問題解析: 看到問題後我就直接去看Json.net原始碼 一探到底原因出在哪邊.
後面發現當我們在呼叫JsonConvert.SerializeObject
方法,會執行一個 private bool CheckForCircularReference 私有方法.
1 2 3 bool exists = (Serializer._equalityComparer != null ) ? _serializeStack.Contains(value , Serializer._equalityComparer) : _serializeStack.Contains(value );