如何根据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的建议。