我有一个这样的课程:
parseInt(aThing, 10)
此类用于存储在NoSQL数据库中,因此我需要存储public class Foo
{
public int Bar { get; set;}
}
值。但是,我不想通过我的API公开这个值。
所以我创建了一个继承自Bar
的类,我将从API返回。
我按照我找到的here文档创建了方法Foo
。
ShouldSerializeBar
但是,不调用该方法。是否有针对此方法或其他方法来实现此目的?
答案 0 :(得分:6)
public class Foo
{
public int Bar { get; set;}
public virtual bool ShouldSerializeBar()
{
return true;
}
}
public class Foo2 : Foo
{
public override bool ShouldSerializeBar()
{
return false;
}
}
答案 1 :(得分:1)
如果您使用IContractResolver,则无需继承Foo
。
来自文档
还可以使用IContractResolver设置ShouldSerialize。 使用IContractResolver有条件地序列化属性是 如果您不想在类上放置ShouldSerialize方法,则非常有用 或者你没有申报课程而且没有。
在你的情况下,这样的事情应该有用。
public class ShouldSerializeContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
if (property.DeclaringType == typeof(Foo) && property.PropertyName == "Bar")
{
property.ShouldSerialize = instance => false;
}
return property;
}
}
然后你可以像
一样使用它var foo = new Foo();
foo.Bar = 1;
string json = JsonConvert.SerializeObject(foo,
Formatting.Indented,
new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() });
虽然我不知道这是否比新类(Foo2
)及其基础中的虚方法更具侵入性,但至少是另一种选择;)