2016-10-14 3 views
1

У меня есть ПОК, который так просто, какJson не сериализации всех объектов в лазури

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

и команда Add, которая выглядит следующим образом

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

    } 
} 

который наследуется от

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

    string CommandName { get; } 
} 

Теперь я отправляю этот код методу, который инициализирует класс установки сериализации Newton Json с некоторыми параметрами для re повернуть объект. Сериализатору выглядит следующим образом

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

сериализатору используется для преобразования команды в полезную нагрузку для посредничества сообщения, как показано ниже

 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; 

    } 

и существует другой метод, который принимает метод

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

Вопрос заключается в десериализации некоторых свойств (ID, CommandName) заполнены стоимостью, за исключением MemberData который является нулевым. Я могу читать поток (делая читатель.ReadToEnd()) и вижу, что он был перенесен по проводу, но Json не может десериализовать весь его объект. В свое время я также думал, что он, возможно, выбирает только поля в интерфейсе, но это не в случае

ответ

2

В вашем MemberData недвижимости есть частный сеттер. Поскольку сериализатор нуждается в доступе к свойству извне, этот сеттер должен быть общедоступным.

Смежные вопросы