C# 使用setter反序列化计算属性
假设我有下面的C#类 现在假设我创建以下实例: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 =
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;
}
}
}