包含覆盖方法的类的Json.Net序列化

时间:2012-02-20 22:06:04

标签: json.net

当我尝试使用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属性,则序列化也可以正常运行。

有人可以帮助我理解为什么覆盖方法会以这种方式破坏序列化吗?有办法吗?

1 个答案:

答案 0 :(得分:1)

我敢打赌你1美元,这个问题与被序列化的类中使用覆盖方法无关。这是Equals()中未经检查的演员表。序列化代码可能会调用.Equals()来检查周期或出于任何其他原因 - 我敢打赌这可以解决问题:

public override bool Equals(object obj) 
{
    Parent parent = obj as Parent;
    return (parent != null) && parent.Id.Equals(Id);
}