2014-09-20 68 views
8

我使用Newtonsoft JSON来序列化/反序列化我的对象。其中一个包含一个带有受保护setter的数组,因为构造函数自己构建数组,并且只有成员被操纵。JSON反序列化构造受保护的setter数组

这可以没有问题的序列化,但是当涉及到反序列化属性它被忽略,因为它不公开。我尝试了一个自定义转换器,它也没有被调用,因为它不公开。

这是一个最小化的例子:

public static class TestCoordsDeserialization 
{ 
    private class Coords 
    { 
     public Double X { get; set; } 
     public Double Y { get; set; } 
     public Double Z { get; set; } 
     public Double A { get; set; } 
    } 

    private class Engine 
    { 
     public string Text { get; set; } 
     public int Id { get; set; } 
     public Coords[] Outs { get; protected set; } 

     public Engine() 
     { 
      this.Outs = new Coords[3]; 
      for (int i = 0; i < this.Outs.Length; i++) 
      { 
       this.Outs[i] = new Coords(); 
      } 
     } 
    } 

    public static void Test() 
    { 
     Engine e = new Engine(); 
     e.Id = 42; 
     e.Text = "MyText"; 
     e.Outs[0] = new Coords() { A = 0, X = 10, Y = 11, Z = 0 }; 
     e.Outs[1] = new Coords() { A = 0, X = 20, Y = 22, Z = 0 }; 
     e.Outs[2] = new Coords() { A = 0, X = 30, Y = 33, Z = 0 }; 
     string json = JsonConvert.SerializeObject(e); 
     Console.WriteLine(json); //{"Text":"MyText","Id":42,"Positions":{"Test":9,"Outs":[{"X":10.0,"Y":11.0,"Z":0.0,"A":0.0},{"X":20.0,"Y":22.0,"Z":0.0,"A":0.0},{"X":30.0,"Y":33.0,"Z":0.0,"A":0.0}]}} 
     Engine r = JsonConvert.DeserializeObject<Engine>(json); 
     double value = r.Outs[1].X; // should be '20.0' 
     Console.WriteLine(value); 
     Debugger.Break(); 
    } 
} 

我怎样才能让value20.0

+1

这里的一些想法:http://dotbrand.wordpress.com/2010/07/05/entities-with-privateprotected-setters-in-ravendb/ – dbc 2014-09-20 15:41:25

回答

14

马克Outs[JsonProperty]属性:

private class Engine 
    { 
     public string Text { get; set; } 
     public int Id { get; set; } 
     [JsonProperty] // Causes the protected setter to be called on deserialization. 
     public Coords[] Outs { get; protected set; } 

     public Engine() 
     { 
      this.Outs = new Coords[3]; 
      for (int i = 0; i < this.Outs.Length; i++) 
      { 
       this.Outs[i] = new Coords(); 
      } 
     } 
    } 
+0

令人难以置信的简单!将我的注意力放在文档中... – ZoolWay 2014-09-20 21:26:53