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 关注
- 125 浏览
添加回答
举报