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

时间:2016-04-28 13:10:02

标签: c# .net serialization json.net deserialization

是否有一些基于非属性的方法忽略序列化时没有相应构造函数参数的所有属性?例如,在序列化此类时,应忽略属性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;
}

1 个答案:

答案 0 :(得分:2)

您可以使用custom 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传递serializeAllWritableProperties,例如AnUnrelatedReadWriteProperty in:

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

注意您可能需要cache your contract resolver for best performance