C# - 对象列表的反序列化,不反序列化继承的属性
问题描述:
我在尝试反序列化对象列表时出现问题。除了由我的基类“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
答
你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]
属性。
它可能是因为在JSON中Id是一个字符串,在你的DTO中它是一个GUID,尝试将它改为字符串并查看它是否有效。理想情况下,您希望dtos与json 100%匹配,然后将dt映射到域对象。 – JOSEFtw