是否有一些非基于属性的方法可以在序列化时忽略所有没有相应构造函数参数的属性?例如,当序列化此类时,应忽略属性 Combo
。 MyClass
实例的往返序列化/反序列化不需要序列化 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/