C# - 对象列表的反序列化,不反序列化继承的属性

时间:2017-07-19 18:16:36

标签: c# json json.net deserialization

当我尝试反序列化对象列表时遇到问题。除了我的基类“BusinessObjectBaseId”继承的属性之外,对象中的所有属性都被反序列化。为什么“Id”属性不会被反序列化? (以下是我的代码/工作流程)

基地:

public abstract class BusinessObjectBaseId : BusinessObjectBase
{
    [DataMember]
    public virtual Guid Id { get; set; }
}

对象:

public class NameAssociation : BusinessObjectBaseId
{
    [DataMember]
    public string Name { get; set; }
}

Json对象:

[{"Name":"Joe","Id":"10eea25b-16aa-42d6-950a-4c28cb0537f4"},{"Name":"Fred","Id":"a913f4b4-1c82-4d19-ade8-949227ac7d08"}]

我打电话:

List<NameAssociation> list = JsonConvert.DeserializeObject<List<NameAssociation>>(jsonData);

我回来了:

[0] : Name: Joe, Id: 00000000-0000-0000-0000-000000000000
[1] : Name: Fred, Id: 00000000-0000-0000-0000-000000000000

1 个答案:

答案 0 :(得分:2)

您已经从基类中省略了[DataContract]属性。此代码重现了该问题:

namespace StackOverflow45198156
{
    class Program
    {
        static void Main(string[] args)
        {
            string json = "[{\"Name\":\"Joe\",\"Id\":\"10eea25b-16aa-42d6-950a-4c28cb0537f4\"},{\"Name\":\"Fred\",\"Id\":\"a913f4b4-1c82-4d19-ade8-949227ac7d08\"}]";

            var list = JsonConvert.DeserializeObject<List<NameAssociation>>(json);
        }
    }

    public abstract class BusinessObjectBaseId
    {
        [DataMember]
        public Guid Id { get; set; }    
    }

    [DataContract]
    public class NameAssociation : BusinessObjectBaseId
    {
        [DataMember]
        public string Name { get; set; }
    }
}

这解决了它:

[DataContract]
public abstract class BusinessObjectBaseId
{
    [DataMember]
    public Guid Id { get; set; }
}

或完全省略所有[DataContract][DataMember]属性。