.net 如何阻止XmlSerializer发出空标记?

.net 如何阻止XmlSerializer发出空标记?,.net,xml-serialization,xmlserializer,.net,Xml Serialization,Xmlserializer,我有一个这样的物体 public class UserObj { public string First {get; set;} public string Last {get; set;} public addr Address {get; set;} } public class addr { public street {get; set;} public town {get; set;} } 现在,当我在上面使用XmlSerialize

我有一个这样的物体

public class UserObj
{
    public string First {get; set;}
    public string Last  {get; set;}
    public addr Address {get; set;}

}

public class addr
{
    public street {get; set;}
    public town   {get; set;}
}
现在,当我在上面使用XmlSerializer时,street和town都是空的,我在XML输出中得到了这个结果

 <Address />

有没有办法不输出这个空标记

谢谢

您可以自己实现和实现序列化例程。这样,就可以避免使用元素


此处的示例:

您可以实现一个
shouldSerializedAddress
方法来决定是否应序列化Address属性:

public bool ShouldSerializeAddress()
{
    return Address != null
        && !String.IsNullOrEmpty(Address.street)
        && !String.IsNullOrEmpty(Address.town);
}
如果存在具有此签名的方法,序列化程序将在序列化属性之前调用它

或者,您可以实现具有相同角色的
AddressSpecified
属性:

public bool AddressSpecified
{
    get
    {
        return Address != null
            && !String.IsNullOrEmpty(Address.street)
            && !String.IsNullOrEmpty(Address.town);
    }
}

可以通过向属性添加DefaultValue属性来消除空值。当属性的值与默认值匹配时,它不会序列化。将默认值设置为null,以消除序列化。下面是一个例子:


using System.ComponentModel;
public class UserObj
{
    public string First {get; set;}
    public string Last  {get; set;}

    [DefaultValue(null)]
    public addr Address {get; set;}

}

我认为为地址字段分配空值应该有效。

为什么需要避免空标记?它们是有效的XML,不是吗?对于第二个解决方案,
xxxsspecified
,必须用
[XmlIgnore]
标记
AddressSpecified
属性,以防止它也被序列化,如本文中所述,这对我不起作用,但@Thomas Levesque的答案起作用。