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

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

最佳答案

您可以使用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 );

如果您还想序列化未包含在构造函数参数列表中的读/写属性,例如,为 serializeAllWritableProperties 传递 true AnUnlatedReadWriteProperty 位于:

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 .

关于c# - 序列化时如何自动忽略没有相应构造函数参数的所有属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36915703/

相关文章:

c# - 使用c#解析xml

hadoop - Spark rawcomparator 上序列化对象的比较

c# - 此 C#.NET 代码的内存分配是什么

c# - 使用 Swagger 的 Web API

c# - .NET 中的多线程 - 在后台实现计数器

c# - 使用 JSON.NET 序列化对象的动态属性名称

c# - 如何在 .NET 中进行对象的深拷贝?

c# - 验证价格的正则表达式

c# - Assert.AreEqual 对于没有增量的 float

c# - ConvertNullDate 扩展方法