1 回答

TA貢獻1796條經驗 獲得超4個贊
為什么 JsonConvert.SerializeObject 會調用該object.Equals方法?
因為當你使用 時JsonConvert.SerializeObject,有一個方法CheckForCircularReference被調用來檢查一個屬性是否重新引用了你自己的對象,導致無限循環。
private bool CheckForCircularReference(JsonWriter writer, object value, JsonProperty property, JsonContract contract, JsonContainerContract containerContract, JsonProperty containerProperty)
在CheckForCircularReference方法中,部分代碼使用了該Contains方法,object.Equals如果您object沒有實現該 IEquatable<T>接口,該方法將調用。
bool exists = (Serializer._equalityComparer != null)
? _serializeStack.Contains(value, Serializer._equalityComparer)
: _serializeStack.Contains(value);
解釋
_serializeStack 是當前正在序列化的對象列表。
該List<T>.Contains方法檢查當前屬性是否包含在集合中。
List<T>.Containsuses EqualityComparer<T>.Default,IEquatable<T>如果類型實現它,則依次使用,object.Equals否則使用。
該object value參數是您當前的Property對象。
下面是一個自引用循環的例子:
public class JsonTestClass
{
public string Name { get; set; }
public List<int> MyIntList { get; set; }
public JsonTestClass Test{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.Test = c;
string json = JsonConvert.SerializeObject
(c, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
我們會得到一個異常:
檢測到類型為“Program+JsonTestClass”的屬性“test”的自引用循環。小路 ''。
但如果我們這樣做,就沒有錯誤:
JsonTestClass c = new JsonTestClass();
c.Name = "test";
c.Test = new JsonTestClass();
string json = JsonConvert.SerializeObject
(c, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All });
- 1 回答
- 0 關注
- 145 瀏覽
添加回答
舉報