Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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# 使用setter反序列化计算属性_C#_.net_Json.net - Fatal编程技术网

C# 使用setter反序列化计算属性

C# 使用setter反序列化计算属性,c#,.net,json.net,C#,.net,Json.net,假设我有下面的C#类 现在假设我创建以下实例: var instance = new MyClass() { Foo = new Foo(){//init properties of Foo}; } 这会被正确地序列化为json,但不会被反序列化。似乎从未调用过Bar.set()。知道为什么吗?我一直在查阅Newtonsoft文档,寻找线索,但还没有发现任何有用的东西。根据我的评论,我提出了以下解决方案,似乎很有效 class MyClass { private Bar _bar =

假设我有下面的C#类

现在假设我创建以下实例:

var instance = new MyClass()
{
  Foo = new Foo(){//init properties of Foo};
}

这会被正确地序列化为json,但不会被反序列化。似乎从未调用过Bar.set()。知道为什么吗?我一直在查阅Newtonsoft文档,寻找线索,但还没有发现任何有用的东西。

根据我的评论,我提出了以下解决方案,似乎很有效

class MyClass
{
  private Bar _bar = new Bar();

  [JsonIgnore]
  public Foo Foo
  {
     get { return Bar.Foo; }
     set { Bar.Foo = value; }
  }

  [JsonProperty("bar")]
  private Bar Bar
  {
    get
    {
      // there's some validation logic that goes here
      return _bar;
    }
    set
    {
      _bar = value;
    }
  }
}

Bar集合中不会有Foo,因为它被忽略了。根据提供的示例,该类的假定设计是有问题的。这基本上与中的问题相同,即在填充预分配的引用类型对象属性时,Json.NET不会调用setter来重置对象,因为据推测,它本来就在那里。使用
ObjectCreationHandling.Replace
的变通方法在这里也适用。或者,您可以在反序列化时预先分配
Foo
,或者让
Bar
有一个指向它的活动指针。另外,
Bar
看起来像什么?在将
MyClass.Bar
序列化为JSON时,它是一个纯粹的DTO,是为了引入一些额外的嵌套级别,还是它还有一些其他职责?是的,Bar是一个提供嵌套级别的DTO。我同意这种课堂设计不是最好的。也许,我应该把事情颠倒过来,把
Foo
作为计算属性。
class MyClass
{
  private Bar _bar = new Bar();

  [JsonIgnore]
  public Foo Foo
  {
     get { return Bar.Foo; }
     set { Bar.Foo = value; }
  }

  [JsonProperty("bar")]
  private Bar Bar
  {
    get
    {
      // there's some validation logic that goes here
      return _bar;
    }
    set
    {
      _bar = value;
    }
  }
}