XML 序列化程序忽略属性取决于条件
XML Serializer ignore attribute depends on condition
我正在使用 XmlConvert
。对于 Class
的一个实例,只有一个 属性 会有值,另一个将为空。
public class Class
{
[XmlAttribute("ValueA")]
public decimal? ValueA { get; set; }
[XmlAttribute("ValueB")]
public decimal? ValueB { get; set; }
}
这里的问题是序列化程序无法序列化 null 属性。
我怎样才能只显示一个 属性 有价值?
示例:
var item = new Class { ValueA = 1, ValueB = null}
<?xml version="1.0" encoding="utf-8"?>
<model>
<ValueA>1</ValueA>
</model>
您需要包装可为空的属性才能使其正常工作。例如,对于您的 ValueA
public class Class
{
[XmlIgnore]
public decimal? ValueA { get; set; }
[XmlAttribute("ValueA")]
public decimal ValueAUnwrapped
{
//this will only called, when ShouldSerializeValueAUnwrapped return trues, so no NRE here
get => ValueA.Value;
set => ValueA = value;
}
public bool ShouldSerializeValueAUnwrapped() => ValueA.HasValue;
}
此代码指示序列化程序仅在原始 ValueA
属性 具有值时序列化 ValueAUnwrapped
属性。这是通过添加 ShouldSerialize<Name>()
函数来实现的,序列化程序将调用相应的 Name
属性 函数:https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods?view=netframeworkdesktop-4.8
您还需要为 ValueB
执行相同的技巧。
我正在使用 XmlConvert
。对于 Class
的一个实例,只有一个 属性 会有值,另一个将为空。
public class Class
{
[XmlAttribute("ValueA")]
public decimal? ValueA { get; set; }
[XmlAttribute("ValueB")]
public decimal? ValueB { get; set; }
}
这里的问题是序列化程序无法序列化 null 属性。 我怎样才能只显示一个 属性 有价值? 示例:
var item = new Class { ValueA = 1, ValueB = null}
<?xml version="1.0" encoding="utf-8"?>
<model>
<ValueA>1</ValueA>
</model>
您需要包装可为空的属性才能使其正常工作。例如,对于您的 ValueA
public class Class
{
[XmlIgnore]
public decimal? ValueA { get; set; }
[XmlAttribute("ValueA")]
public decimal ValueAUnwrapped
{
//this will only called, when ShouldSerializeValueAUnwrapped return trues, so no NRE here
get => ValueA.Value;
set => ValueA = value;
}
public bool ShouldSerializeValueAUnwrapped() => ValueA.HasValue;
}
此代码指示序列化程序仅在原始 ValueA
属性 具有值时序列化 ValueAUnwrapped
属性。这是通过添加 ShouldSerialize<Name>()
函数来实现的,序列化程序将调用相应的 Name
属性 函数:https://docs.microsoft.com/en-us/dotnet/desktop/winforms/controls/defining-default-values-with-the-shouldserialize-and-reset-methods?view=netframeworkdesktop-4.8
您还需要为 ValueB
执行相同的技巧。