如何根据XmlSerializer的值忽略属性

时间:2011-12-18 18:32:40

标签: c# .net xml-serialization

如果属性具有默认值,我希望XmlSerializer创建的XML排除属性。这是可能的XmlSerializer还是我将不得不考虑IXmlSerializable?

例如,我可能有以下课程:

public class PositionedObject
{
   public float X
   { get; set; }

   public float Y
   { get; set;}
}

我想告诉XmlSerializer在序列化PositionedObject的实例时,如果值为0则不包括X(如果为0则与Y相同)。

4 个答案:

答案 0 :(得分:10)

只需声明一个名为ShouldSerializeX的方法,当该值不为0时返回true:

public bool ShouldSerializeX()
{
    return X != 0;
}

序列化程序将调用此方法来决定是否应该序列化属性。

答案 1 :(得分:9)

另一个支持的XmlSerializer模式;

[DefaultValue({whatever})]
public SomeType SomeProperty {get;set;}

但请注意,无参数构造函数必须分配此值,否则将发生不可预测的结果。

答案 2 :(得分:1)

您的班级可以实施IXmlSerializable,并且在WriteXml方法中选择不将具有您认为默认值的属性序列化。

public class PositionedObject : IXmlSerializable
{

  public void WriteXml(System.Xml.XmlWriter writer)
  {
        if (  Position != DefaultPosition )
          writer.WriteAttributeString("Position", Position);
  }
}

在你的位置是浮动对,你可能需要使用一些容差

答案 3 :(得分:0)

托马斯的方式可能是你想要的最简单的方法。但是,您可能需要考虑技术值类型始终具有值,您可能应该序列化它。请注意,如果您要将XmlSerializer声明为X或其他参考类型,string将跳过添加float?元素。 当然将X坐标声明为字符串会很愚蠢,但您可以将其声明为可空<X xsi:nil="true" />,它将序列化为{{1}},可能更接近您实际想要的...除非你只是想让你的XML看起来漂亮,然后得到Thomas的建议。