You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

方案优势

  1. 完全兼容存量已序列化的文件,不需要修改原有序列化逻辑
  2. 支持嵌套对象的属性忽略,不需要额外处理层级逻辑
  3. 不需要修改业务对象的原有代码(如果是用类+属性名规则忽略的话,甚至不需要加自定义特性)

内容的提问来源于stack exchange,提问作者Eliahu Aaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:06:03