У меня вопрос по поводу сериализации NewtonSoft Json.Net.Я искал вокруг, но не смог найти решение.В SO есть некоторые вопросы, которые напоминают этот по названию, но ни один не представляет этот сценарий.
Мне нужно предотвратить сериализацию определенных объектов при определенных условиях.
Пример: данныйэтот класс:
class A
{
B b;
}
Мы можем предотвратить сериализацию B, написав:
class A
{
B b;
public bool ShouldSerializeb()
{
return false; //validate the condition you want.
}
}
Но если у нас есть несколько 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», чтобы проверить его внутренности?
Есть ли способ написать функцию для проверки самого объекта, а не члена? Примерно так:
class B
{
public bool ShouldSerialize()
{
return false; //validate the condition you want.
}
}
Спасибо (вероятно, я должен опубликовать это на github, но мы так привыкли концентрировать вопросы в SO)