如何根据XmlSerializer的值忽略属性

我希望XmlSerializer创建的XML如果它们具有默认值,则排除属性。 这是可能的XmlSerializer或我将不得不看看IXmlSerializable?

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

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

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

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

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

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

另一个支持的XmlSerializer模式;

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

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

您的类可以实现IXmlSerializable并且在WriteXml方法中选择不序列化具有您认为是默认值的属性。

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

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

托马斯的方式可能是你想要的最简单的方法。 但是,您可能需要考虑技术值类型始终具有值,并且您可能应该序列化它。 请注意,如果要将其声明为string或其他引用类型, XmlSerializer将跳过添加X元素。
当然将X坐标声明为字符串会很愚蠢,但你可以将它声明为可空float? ,它将序列化为 ,这可能更接近你真正想要的……除非你只是想让你的XML看起来漂亮,然后得到Thomas的建议。