我需要能够控制如何/是否对类的某些属性进行序列化。最简单的情况是[ScriptIgnore]。但是,我只希望针对我正在处理的这一特定序列化情况来兑现这些属性- 如果应用程序中下游的其他模块也希望序列化这些对象,则这些属性都不会妨碍您。
[ScriptIgnore]
因此,我的想法是在属性MyAttribute上使用自定义属性,并使用知道要查找该属性的钩子初始化JsonSerializer的特定实例。
MyAttribute
乍一看,我看不到JSON.NET中的任何可用挂钩点都会为PropertyInfo当前属性提供进行此类检查的功能- 仅属性的值。我想念什么吗?还是解决这个问题的更好方法?
PropertyInfo
您有几种选择。我建议您在阅读以下内容之前,先阅读有关该主题的Json.Net文档文章。
本文介绍了两种方法:
bool
在这两者中,我赞成后者。完全跳过属性- 仅使用它们忽略所有形式的序列化中的属性。相反,创建一个忽略有问题的属性的自定义合同解析器,并且仅在您要忽略该属性时才使用合同解析器,而让该类的其他用户可以随意序列化该属性,也可以不随意执行。
编辑 为了避免链接腐烂,我将从文章中发布相关代码
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.DeclaringType == typeof(Employee) && property.PropertyName == "Manager" ) { property.ShouldSerialize = instance => { // replace this logic with your own, probably just // return false; Employee e = (Employee)instance; return e.Manager != e; }; } return property; } }