2017-07-19 3 views
0

Je rencontre un problème lorsque je tente de désérialiser une liste d'objets. Toutes les propriétés de l'objet sont désérialisées, à l'exception des propriétés héritées par ma classe de base "BusinessObjectBaseId". Pourquoi la propriété "Id" ne serait-elle pas désérialisée? (Ce qui suit est mon code/flux de travail)C# - Désérialisation de la liste d'objets, ne désérialise pas les propriétés héritées

Base

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

Objet:

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

Json Objet:

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

J'appelle:

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

Je reviens:

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

peut-être parce que dans l'ID JSON est une chaîne, dans votre DTO c'est un GUID, essayez de le changer en chaîne et voir si cela fonctionne. Idéalement, vous voulez que le dtos corresponde au json 100% et que vous liez ensuite les dtos aux objets du domaine. – JOSEFtw

Répondre

2

Vous avez omittted l'attribut [DataContract] de la classe de base. Ce code reproduit la question:

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; } 
    } 
} 

Et cela résout le:

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

Ou omettent tous les attributs [DataContract] et [DataMember] tout à fait.