【发布时间】:2018-12-14 15:11:31
【问题描述】:
我有一个关于 NewtonSoft Json.Net 序列化的问题。 我四处寻找,但未能找到解决方案。 SO中有一些问题与标题相似,但没有一个问题出现这种情况。
我需要的是防止某些对象在某些条件下被序列化。
示例: 给定这个类:
class A
{
B b;
}
我们可以通过写来防止B被序列化:
class A
{
B b;
public bool ShouldSerializeb()
{
return false; //validate the condition you want.
}
}
但如果我们有多个 B,我们最终不得不为每个 B 编写一个函数:
class A
{
B b;
B bb;
B bbb;
public bool ShouldSerializeb()
{
return false; //validate the condition you want.
}
public bool ShouldSerializebb()
{
return false; //validate the condition you want.
}
public bool ShouldSerializebbb()
{
return false; //validate the condition you want.
}
}
还有另一种方法:使用合约解析器
public class ShouldSerializeContractResolver : DefaultContractResolver
{
public new static readonly ShouldSerializeContractResolver Instance
= new ShouldSerializeContractResolver();
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.PropertyType == typeof(B))
{
property.ShouldSerialize =
instance =>
{
if (instance == null)
return false;
// The problem is that "instance" here is A and not B
// preventing the necessary validation
return false; //validate the condition you want.
};
}
return property;
}
}
问题:
有没有办法让“实例为“B”以验证其内部结构?
有没有办法编写函数来验证对象本身而不是成员? 像这样:
谢谢 (我可能应该在 github 上发布这个,但我们习惯于将问题集中在 SO)
【问题讨论】: