如果属性具有默认值,我希望XmlSerializer创建的XML排除属性。这是可能的XmlSerializer还是我将不得不考虑IXmlSerializable?
例如,我可能有以下课程:
public class PositionedObject
{
public float X
{ get; set; }
public float Y
{ get; set;}
}
我想告诉XmlSerializer在序列化PositionedObject的实例时,如果值为0则不包括X(如果为0则与Y相同)。
答案 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的建议。