如何根据序列值从序列化中排除属性?

时间:2017-01-05 08:30:48

标签: c# xml serialization properties

为了与Web API进行通信,我创建了一些类,这些类将被序列化为XML并发送到API。如果API仅包含具有非默认值的属性,则API仅接受这些XML。

如何在序列化期间遗漏属性?

假设我有一个类如下(简化示例):

[XmlRoot("SomeData")]
public class SomeData
{
    [XmlElement("rangeX")]
    public int RangeX { get; set; }

    [XmlElement("rangeY")]
    public int RangeY { get; set; }

    [XmlElement("rangeZ")]
    public int RangeZ { get; set; }
}

因此,具有RangeX和RangeY的非默认值的对象应序列化为仅包含rangeX和rangeY标记的XML。

我已经找到了如何省略空值,但这不是我想要的 - 默认值可能与null不同。

谢谢!

2 个答案:

答案 0 :(得分:3)

你可以使用"秘密" ShouldSerializeXxx()方法:

public bool ShouldSerializeRangeX()
{
    return RangeX != someDefaultValue;
}

当您搜索 ShouldSerialize默认值时,有大量示例,如果您不知道自己在寻找什么,就很难找到。

以下链接可帮助您入门:Defining Default Values with the ShouldSerialize and Reset Methods

答案 1 :(得分:1)

当您实现IXmlSerializable接口时,您可以完全控制类的对象的序列化(仅包括编写数据的代码,因为这是您当前的问题):

public class SomeData : IXmlSerializable
{
    public int RangeX { get; set; }

    public int RangeY { get; set; }

    public int RangeY { get; set; }

    public void WriteXml (XmlWriter writer)
    {
        writer.WriteStartElement("SomeData");
        if (RangeX != 0)
        {
            writer.WriteElementString("rangeX", RangeX.ToTring());
        }
        if (RangeY != 0)
        {
            writer.WriteElementString("rangeY", RangeY.ToTring());
        }
        if (RangeZ != 0)
        {
            writer.WriteElementString("rangeZ", RangeZ.ToTring());
        }
        writer.WriteEndElement();
    }

    public void ReadXml (XmlReader reader)
    {
        //Implement if needed
        throw new NotImplementedException();
    }

    public XmlSchema GetSchema()
    {
        return null;
    }
}