2017-06-27 5 views
0

Voici mon modèle:cadre DataContract ne fonctionne pas lorsque des objets sérialisation JSON

namespace RESTalm 
{ 
    [DataContract] 
    [KnownType(typeof(Entity))] 
    [KnownType(typeof(Field))] 
    [KnownType(typeof(Value))] 
    public class Entities 
    { 
     [DataMember(IsRequired = true)] 
     public List<Entity> entities; 

     [DataMember(IsRequired = true)] 
     public int TotalResults; 
    } 

    [DataContract] 
    [KnownType(typeof(Field))] 
    [KnownType(typeof(Value))] 
    public class Entity 
    { 
     [DataMember(IsRequired = true)] 
     public Field[] Fields; 

     [DataMember(IsRequired = true)] 
     public String Type; 
    } 

    [DataContract] 
    [KnownType(typeof(Value))] 
    public class Field 
    { 
     [DataMember(IsRequired = true)] 
     public String Name; 

     [DataMember(IsRequired = true)] 
     public Value[] values; 
    } 

    [DataContract] 
    [KnownType(typeof(Value))] 
    public class Value 
    { 
     [DataMember(IsRequired = true)] 
     public String value; 
    }  
} 

Voici mon programme:

 private String toJSON(Object poco) 
     { 
      String json; 
      DataContractJsonSerializer jsonParser = new DataContractJsonSerializer(poco.GetType()); 
      MemoryStream buffer = new MemoryStream(); 

      jsonParser.WriteObject(buffer, poco); 
      StreamReader reader = new StreamReader(buffer); 
      json = reader.ReadToEnd(); 
      reader.Close(); 
      buffer.Close(); 

      return json; 
    } 

Lorsque l'objet jsonParser initialise il ne semble pas reconnaître mon modèle du tout. Ceci conduit à MemoryStream() vide. S'il vous plaît aider.

P.S. J'ai éliminé les exceptions dans mon programme parce que c'est distrayant. Merci. En outre, pour l'instant l'objet poco est toujours supposé être un type dans mon modèle.

+0

Et oui; ils sont tous dans le même espace-nom et ont toutes les références nécessaires. – Olivier10178

+1

Il semble que vous devez revenir en arrière le flux au début en remettant à zéro le [ 'position'] (https://msdn.microsoft.com/en-us/library/system.io.stream.position.aspx) avant peut en lire. – dbc

+0

@dbc vous génial, je t'aime. – Olivier10178

Répondre

1

Vous devez revenir en arrière le flux au début en remettant à zéro son Position avant de pouvoir lire de lui, par exemple comme ceci:

public static string ToJson<T>(T obj, DataContractJsonSerializer serializer = null) 
{ 
    serializer = serializer ?? new DataContractJsonSerializer(obj == null ? typeof(T) : obj.GetType()); 
    using (var memory = new MemoryStream()) 
    { 
     serializer.WriteObject(memory, obj); 
     memory.Seek(0, SeekOrigin.Begin); 
     using (var reader = new StreamReader(memory)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
}