2017-07-19 163 views
0

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

基地:

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

它可能是因为在JSON中Id是一个字符串,在你的DTO中它是一个GUID,尝试将它改为字符串并查看它是否有效。理想情况下,您希望dtos与json 100%匹配,然后将dt映射到域对象。 – JOSEFtw

回答

2

你omittted从基类的[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]属性。