C# 如何根据属性的值从序列化中排除属性?
为了与web API通信,我创建了几个类,这些类将被序列化为XML并发送到API。API仅在这些XML仅包含非默认值的属性时才接受它们 在序列化过程中如何省略属性 假设我有一个类,如下所示(简化示例): 因此,对于RangeX和RangeY具有非默认值的对象,应该序列化为只包含RangeX和RangeY标记的XML 我发现了如何省去空值,但这不是我想要的-默认值很可能与空值不同 谢谢 您可以使用“secret”ShouldSerializeXxx()方法: 当你搜索ShouldSerialize默认值时,有很多例子,如果你不知道你在寻找什么,很难找到 这里有一个帮助您入门的链接:您可以使用“secret”ShouldSerializeXxx()方法: 当你搜索ShouldSerialize默认值时,有很多例子,如果你不知道你在寻找什么,很难找到C# 如何根据属性的值从序列化中排除属性?,c#,xml,serialization,properties,C#,Xml,Serialization,Properties,为了与web API通信,我创建了几个类,这些类将被序列化为XML并发送到API。API仅在这些XML仅包含非默认值的属性时才接受它们 在序列化过程中如何省略属性 假设我有一个类,如下所示(简化示例): 因此,对于RangeX和RangeY具有非默认值的对象,应该序列化为只包含RangeX和RangeY标记的XML 我发现了如何省去空值,但这不是我想要的-默认值很可能与空值不同 谢谢 您可以使用“secret”ShouldSerializeXxx()方法: 当你搜索ShouldSerialize
下面是一个帮助您入门的链接:在实现接口时,您可以完全控制类对象的序列化方式(仅包括编写数据的代码,因为这是您的直接问题):
实现接口时,您可以完全控制类对象的序列化方式(仅包括编写数据的代码,因为这是您的直接问题):
尝试在上面使用LINQ。例如,
var newSomeData=existingSomeData.Select(x=>x)
在序列化之前。@krangprime您是否能够以这种方式排除属性?@C.Evenhuis-如果您使用相同的方法“转换”到没有该属性的新类,则为“是”。您的解决方案非常性感,尝试在其上使用LINQ。例如,var newSomeData=existingSomeData.Select(x=>x)
在序列化之前。@krangprime您是否能够以这种方式排除属性?@C.Evenhuis-如果您使用相同的方法“转换”到没有该属性的新类,则为“是”。您的解决方案非常有用,因为为上述必要信息添加了MSDN链接:)为上述必要信息添加了MSDN链接:)我接受了C.Evenhuis发布的解决方案,因为这意味着我们现有代码库的更改更少。但是,您发布的解决方案教会了我如何完全控制生成的XML,因此我要明确地感谢您的发布!!我接受了C.Evenhuis发布的解决方案,因为这意味着我们现有代码库的更改更少。但是,您发布的解决方案教会了我如何完全控制生成的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; }
}
public bool ShouldSerializeRangeX()
{
return RangeX != someDefaultValue;
}
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;
}
}