2016-10-14 7 views
1

I POCO haben, die so einfach ist, wieJson nicht alle Objekte in Azure Serialisierung

public partial class Member 
{ 

    public int ID { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string MemberId { get; set; } 

    public DateTime CreatedOn { get; set; } 

    [Required] 
    [StringLength(100)] 
    public string FirstName { get; set; }} 

und ein Add-Befehl, wie diese

public class AddMemberCommand : ICommand 
{ 
    public AddMemberCommand(Member member ) 
    { 
     ID = Guid.NewGuid(); 
     MemberData = member; 
    } 


    public Member MemberData { get; private set; } 

    public Guid ID { get; } 


    public string CommandName 
    { 
     get { return "AddMemberCommand"; } 

    } 
} 

sieht, die von

erbt
public interface ICommand 
{ 
    /// <summary> 
    /// Gets the command identifier. 
    /// </summary> 
    Guid ID { get; } 

    string CommandName { get; } 
} 

Jetzt sende ich diesen Code an eine Methode, die Newton Jsons Serialisierungs-Einstellungsklasse mit einigen Parametern initialisiert ein Objekt drehen Der Serialisierer sieht wie folgt

public class JsonTextSerializer 
{ 
    private readonly JsonSerializer _serializer; 

    public JsonTextSerializer() 
    { 
     _serializer = JsonSerializer.Create(new JsonSerializerSettings 
     { 
      TypeNameHandling = TypeNameHandling.All, 
      ReferenceLoopHandling = ReferenceLoopHandling.Ignore, 
      TypeNameAssemblyFormat = FormatterAssemblyStyle.Simple 
     }); 
    } 

    public void Serialize(TextWriter writer, object graph) 
    { 
     var jsonWriter = new JsonTextWriter(writer); 
     jsonWriter.Formatting = Formatting.Indented; 
     _serializer.Serialize(jsonWriter, graph); 
     writer.Flush(); 
    } 

    public object Deserialize(TextReader reader) 
    { 
     var jsonReader = new JsonTextReader(reader); 

     try 
     { 
      return this._serializer.Deserialize(jsonReader); 
     } 
     catch (JsonSerializationException e) 
     { 
      // Wrap in a standard .NET exception. 
      throw new SerializationException(e.Message, e); 
     } 
    } 
} 

Der Serialisierer verwendet wird, um den Befehl in einer Nutzlast für die vermittelte Nachricht zu konvertieren, wie unten

 private BrokeredMessage CreateMessage(POCOS.Member member) 
    { 
     var serializer = new JsonTextSerializer(); 
     var command = new AddMemberCommand(member); 
     var stream = new MemoryStream(); 
     var writer = new StreamWriter(stream); 
     serializer.Serialize(writer, command); 
     stream.Position = 0; 
     BrokeredMessage message = new BrokeredMessage(stream, true); 
     return message; 

    } 

und es gibt ein weiteres Verfahren dargestellt, welches das Verfahren erhält

private POCOS.Member GetPocoFromMessage(BrokeredMessage message) 
    { 
     ITextSerializer serializer = new JsonTextSerializer(); 
     AddMemberCommand command; 

     using (var stream = message.GetBody<Stream>()) 
     { 
      using (var reader = new StreamReader(stream)) 
      { 
       var payload = serializer.Deserialize(reader); 
       command = payload as AddMemberCommand; 
      } 
     } 

     return command.MemberData; 
    } 

Das Problem besteht in der Deserialisierung einiger Eigenschaften (ID, CommandName) werden mit Ausnahme von MemberData gefüllt, was null ist. Ich kann den Strom lesen (indem ich eine reader.ReadToEnd()) und sehen, es wurde über die Leitung übertragen, aber Json kann nicht alle sein Objekt deserialize Auf einmal dachte ich auch, es vielleicht nur Felder in der Schnittstelle, aber das ist nicht der Fall

Antwort

2

Ihre MemberData Eigenschaft hat einen privaten Setter. Da der Serializer extern auf die Eigenschaft zugreifen muss, sollte dieser Setter öffentlich sein.