当我尝试使用Json.Net序列化以下类时,我收到异常:
[Serializable]
[DataContract(Name = "child", Namespace = "")]
public class Child
{
[DataMember(Name = "id", EmitDefaultValue = false)]
public int Id { get; set; }
}
[Serializable]
[DataContract(Name = "parent", Namespace = "")]
public class Parent
{
[DataMember(Name = "id", EmitDefaultValue = false)]
public int Id { get; set; }
[DataMember(Name = "children", EmitDefaultValue = false)]
public List<Child> Children { get; set; }
public override bool Equals(object obj)
{
Parent parent = (Parent)obj;
return parent.Id.Equals(Id);
}
}
这是序列化代码:
SortedDictionary<int, Parent> parents = new SortedDictionary<int, Parent>
{
{
1,
new Parent
{
Id = 1,
Children = new List<Child>
{
new Child
{
Id = 2
}
}
}
}
};
string json = JsonConvert.SerializeObject(parents);
以下是例外:
System.InvalidCastException was unhandled by user code
Message=Unable to cast object of type 'System.Collections.Generic.List`1[Child]' to type 'Parent'.
如果我删除Equals
覆盖方法,则会发生序列化而不会出错。如果我从List<Child>
类中删除Parent
属性,则序列化也可以正常运行。
有人可以帮助我理解为什么覆盖方法会以这种方式破坏序列化吗?有办法吗?
答案 0 :(得分:1)
我敢打赌你1美元,这个问题与被序列化的类中使用覆盖方法无关。这是Equals()
中未经检查的演员表。序列化代码可能会调用.Equals()
来检查周期或出于任何其他原因 - 我敢打赌这可以解决问题:
public override bool Equals(object obj)
{
Parent parent = obj as Parent;
return (parent != null) && parent.Id.Equals(Id);
}