SharpSerializer反序列化时如何忽略指定属性与特性?
关于SharpSerializer反序列化阶段忽略属性的问题解答
结论验证
你测试得出的「SharpSerializerSettings.AdvancedSettings.AttributesToIgnore、SharpSerializerSettings.AdvancedSettings.PropertiesToIgnore仅在序列化阶段生效」的结论是完全正确的。
查阅官方源码可发现,两个配置的过滤逻辑仅在序列化遍历对象属性的流程中被调用,反序列化阶段读取属性映射、赋值的逻辑完全没有关联这两个配置的校验,因此无法作用于反序列化阶段。
可行解决方案
推荐使用自定义对象工厂重写属性填充逻辑的方案,侵入性低、兼容存量序列化文件,且支持嵌套对象的属性忽略:
步骤1:自定义忽略特性(可选,按需求使用)
如果需要按特性标记忽略属性,先定义对应的特性类:
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)] public class DeserializeIgnoreAttribute : Attribute { }
步骤2:重写DefaultObjectFactory
继承SharpSerializer默认的对象工厂,重写属性填充方法,在赋值前过滤需要忽略的属性:
using Polenter.Serialization.Core; using System.Reflection; public class IgnorePropertyObjectFactory : DefaultObjectFactory { private readonly HashSet<Type> _ignoreAttributes; private readonly HashSet<string> _ignoreProperties; /// <param name="ignoreAttributes">需要忽略的特性类型列表</param> /// <param name="ignoreProperties">需要忽略的属性标识列表,格式为「类完整名称:属性名」</param> public IgnorePropertyObjectFactory(IEnumerable<Type> ignoreAttributes = null, IEnumerable<string> ignoreProperties = null) { _ignoreAttributes = new HashSet<Type>(ignoreAttributes ?? Enumerable.Empty<Type>()); _ignoreProperties = new HashSet<string>(ignoreProperties ?? Enumerable.Empty<string>()); } protected override void FillProperties(object obj, IEnumerable<PropertyInfo> properties, Dictionary<string, object> propertyValues) { // 过滤不需要赋值的属性 var validProperties = properties.Where(prop => { // 检查是否标记了忽略特性 if (_ignoreAttributes.Any(attrType => prop.IsDefined(attrType, true))) return false; // 检查是否在指定忽略的属性列表中 var propKey = $"{prop.DeclaringType.FullName}:{prop.Name}"; if (_ignoreProperties.Contains(propKey)) return false; return true; }); base.FillProperties(obj, validProperties, propertyValues); } }
步骤3:配置SharpSerializer使用自定义工厂
初始化的时候将自定义工厂注入配置即可,原有其他配置不需要修改:
var serializerSettings = new SharpSerializerSettings(); // 保留你原有的其他配置逻辑 // ... // 注入自定义忽略逻辑 serializerSettings.AdvancedSettings.ObjectFactory = new IgnorePropertyObjectFactory( // 传入要忽略的特性,比如上面自定义的DeserializeIgnoreAttribute ignoreAttributes: new[] { typeof(DeserializeIgnoreAttribute) }, // 传入要忽略的指定类属性,示例:忽略SampleClass类的TestProp属性 ignoreProperties: new[] { "YourNamespace.SampleClass:TestProp" } ); var serializer = new SharpSerializer(serializerSettings);
方案优势
- 完全兼容存量已序列化的文件,不需要修改原有序列化逻辑
- 支持嵌套对象的属性忽略,不需要额外处理层级逻辑
- 不需要修改业务对象的原有代码(如果是用类+属性名规则忽略的话,甚至不需要加自定义特性)
内容的提问来源于stack exchange,提问作者Eliahu Aaron
相关产品推荐
相关产品推荐

