Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从json反序列化受保护的构造对象_C#_.net_Constructor_Json.net_Deserialization - Fatal编程技术网

C# 从json反序列化受保护的构造对象

C# 从json反序列化受保护的构造对象,c#,.net,constructor,json.net,deserialization,C#,.net,Constructor,Json.net,Deserialization,我正在使用newton的json.net序列化程序。将json反序列化为“thebox”时;它进入受保护的ctor并获取默认属性值。但不是json字符串中的属性值。我能在不使用dto或任何其他映射器框架的情况下解决这个问题吗 class TheFox { string _Id; string _Name; protected TheFox() { _Id = "Default Id"; _Name = "Default

我正在使用newton的json.net序列化程序。将json反序列化为“thebox”时;它进入受保护的ctor并获取默认属性值。但不是json字符串中的属性值。我能在不使用dto或任何其他映射器框架的情况下解决这个问题吗

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");
var-fox=new-TheFox(“FoxId”、“FoxTail”);
var json=JsonConvert.SerializeObject(fox);
Console.WriteLine(json);
var设置=新的JsonSerializerSettings()
{
ConstructorHandling=ConstructorHandling.AllowNonPublicDefaultConstructor
};
返回的var=JsonConvert.DeserializeObject(json,设置);
Assert.IsTrue(返回的.Id!=“默认Id”);
Assert.IsTrue(返回的.Name!=“默认名称”);

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

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

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

检查了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));

我只是用一个框架反序列化我的对象。我与wcf无关。你的两个构造函数递归地调用自己。我删除了参数并运行了测试。没有,结果没有改变。仍然是默认值。对不起,这是我最后一次尝试在iPad上编写代码!修复了错误。奇怪的是,这么多反序列化程序不支持参数化构造函数。您是否强烈反对对这些属性使用受保护的甚至私有的setter?如果与[JsonProperty]注释一起使用,它将对您有所帮助。