XML Serializer 忽略属性取决于条件

问题描述

我正在使用 XmlConvert。对于 Class一个实例,只有一个属性有值,另一个为空。

public class Class
{
    [XmlAttribute("ValueA")]
    public decimal? ValueA { get; set; }

    [XmlAttribute("ValueB")]
    public decimal? ValueB { get; set; }
}

这里的问题是序列化器不能序列化空属性。 如何只显示一个有价值的属性? 示例:

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

此代码指示序列化程序仅在原始 ValueAUnwrapped 属性具有值时才序列化 ValueA 属性。这是通过添加序列化程序将为相应的 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 执行相同的技巧。