为了与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不同。
谢谢!
答案 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;
}
}