2016-10-14 2 views
1

内のすべてのオブジェクトをシリアライズないような単純なJSONは私があるPOCOを持っているのAzure

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

などと

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

    string CommandName { get; } 
} 

から継承この

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

    } 
} 

のように見えるAddコマンド今度はこのコードをNewton Jsonのシリアライズ設定クラスをいくつかのパラメータで初期化するメソッドに送りますオブジェクトを回転させる。

 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; 

    } 

下に示すように、この

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 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(null)以外の値で埋められます。 ストリームを読むことができます(reader.ReadToEnd()を実行することによって)、それはワイヤで転送されましたが、Jsonはすべてのオブジェクトをデシリアライズできません 一度に私はおそらく、そうでない場合

答えて

2

MemberDataプロパティには専用のセッターがあります。シリアライザはプロパティに外部からアクセスする必要があるため、このセッタはパブリックにする必要があります。

関連する問題