正在从json反序列化受保护的构造对象



我使用的是牛顿的json.net序列化程序。将json反序列化为"TheFox"时;它进入受保护的ctor并获取默认的属性值。但不是json字符串中的属性值。我可以在不使用dto或任何其他mapper框架的情况下解决这个问题吗?

class TheFox
    {
    string _Id;
    string _Name;
    protected TheFox()
    {
        _Id = "Default Id";
        _Name = "Default Name";
    }
    public TheFox(string id, string name) : this()
    {
        _Name = name;
        _Id = id;
    }
    public string Id
    {
        get { return _Id; }
    }
    public string Name
    {
        get { return _Name; }
    }
}

这就是测试:

        var fox = new TheFox("FoxId", "FoxTail");
        var json = JsonConvert.SerializeObject(fox);
        Console.WriteLine(json);
        var settings = new JsonSerializerSettings ()
        {
            ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor
        };
        var returned = JsonConvert.DeserializeObject<TheFox> (json, settings);
        Assert.IsTrue (returned.Id != "Default Id");
        Assert.IsTrue (returned.Name != "Default Name");

检查了json.net中的源代码,现在没有办法。因为如果给定的属性是只读的,它将跳过设置值阶段。可能需要内部字段填充器功能。

private void SetPropertyValue(JsonProperty property, JsonReader reader, object target)
    {
      // bla.. bla.. bla..
      if (!property.Writable && !useExistingValue)
      {
        reader.Skip();
        return;
      }

这个方法不好,它需要一个实例化的对象来填充,但它可以工作。

var a = new TheFox("x", "y");
var json = JsonConvert.SerializeObject(a);
Console.WriteLine(json);
var returned = JsonConvert.DeserializeAnonymousType(json, new TheFox("q", "a")); 
Assert.That(a.Id, Is.EqualTo(returned.Id));
Assert.That(a.Name, Is.EqualTo(returned.Name));
    class TheFox
    {
      string _Id;
      string _Name;
      protected TheFox() : this("Default Id", "Default Name")
      public TheFox(string id, string name)
      {
        _Name = name;
        _Id = id;
      }
      public string Id
      {
        get { return _Id; }
      }
      public string Name
      {
        get { return _Name; }
      }
}

这应该允许相同的用法,但提供了与牛顿的可比性。

您的类不适合客户端操作。您需要对类使用DataContractAttribute,对要序列化的成员使用DataMemberAttribute属性。

相关内容

  • 没有找到相关文章

最新更新