如何在序列化时自动忽略没有相应构造函数参数的所有属性



是否有一些非基于属性的方法在序列化时忽略所有没有相应构造函数参数的属性? 例如,序列化此类时,应忽略属性ComboMyClass 实例的往返序列化/反序列化不需要序列化Combo。 理想情况下,我可以使用一些开箱即用的设置。

public class MyClass
{
    public MyClass(int myInt, string myString)
    {
        this.MyInt = myInt;
        this.MyString = myString;
    }
    public int MyInt { get; }
    public string MyString { get; }
    public string Combo => this.MyInt + this.MyString;
}
您可以使用

自定义IContractResolver执行此操作:

public class ConstructorPropertiesOnlyContractResolver : DefaultContractResolver
{
    readonly bool serializeAllWritableProperties;
    public ConstructorPropertiesOnlyContractResolver(bool serializeAllWritableProperties)
        : base()
    {
        this.serializeAllWritableProperties = serializeAllWritableProperties;
    }
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        var contract = base.CreateObjectContract(objectType);
        if (contract.CreatorParameters.Count > 0)
        {
            foreach (var property in contract.Properties)
            {
                if (contract.CreatorParameters.GetClosestMatchProperty(property.PropertyName) == null)
                {
                    if (!serializeAllWritableProperties || !property.Writable)
                        property.Readable = false;
                }
            }
        }
        return contract;
    }
}

然后像这样使用它:

var settings = new JsonSerializerSettings { ContractResolver = new ConstructorPropertiesOnlyContractResolver(false) };
var json = JsonConvert.SerializeObject(myClass, Formatting.Indented, settings );
如果

还想序列化构造函数参数列表中未包含的读/写属性,请传递true for serializeAllWritableProperties,例如 AnUnrelatedReadWriteProperty

public class MyClass
{
    public MyClass(int myInt, string myString)
    {
        this.MyInt = myInt;
        this.MyString = myString;
    }
    public int MyInt { get; private set; }
    public string MyString { get; private set; }
    public string Combo { get { return this.MyInt + this.MyString; } }
    public string AnUnrelatedReadWriteProperty { get; set; }
}

请注意,您可能需要缓存合约解析程序以获得最佳性能。

相关内容

  • 没有找到相关文章

最新更新