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

C# 如何根据属性的值从序列化中排除属性?,c#,xml,serialization,properties,C#,Xml,Serialization,Properties,为了与web API通信,我创建了几个类,这些类将被序列化为XML并发送到API。API仅在这些XML仅包含非默认值的属性时才接受它们 在序列化过程中如何省略属性 假设我有一个类,如下所示(简化示例): 因此,对于RangeX和RangeY具有非默认值的对象,应该序列化为只包含RangeX和RangeY标记的XML 我发现了如何省去空值,但这不是我想要的-默认值很可能与空值不同 谢谢 您可以使用“secret”ShouldSerializeXxx()方法: 当你搜索ShouldSerialize

为了与web API通信,我创建了几个类,这些类将被序列化为XML并发送到API。API仅在这些XML仅包含非默认值的属性时才接受它们

在序列化过程中如何省略属性

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

因此,对于RangeX和RangeY具有非默认值的对象,应该序列化为只包含RangeX和RangeY标记的XML

我发现了如何省去空值,但这不是我想要的-默认值很可能与空值不同

谢谢

您可以使用“secret”ShouldSerializeXxx()方法:

当你搜索ShouldSerialize默认值时,有很多例子,如果你不知道你在寻找什么,很难找到

这里有一个帮助您入门的链接:

您可以使用“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;
    }
}