Как я могу остановить пустую метку от испускания XmlSerializer? - PullRequest
6 голосов
/ 02 июня 2010

У меня есть такой объект,

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, а улица и город пусты, я получаю это в выводе XML,

 <Address />

Есть ли способ не выводить этот пустой тег?

Спасибо

Ответы [ 4 ]

3 голосов
/ 02 июня 2010

Вы можете реализовать метод ShouldSerializeAddress, чтобы решить, следует ли сериализовать свойство 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);
    }
}
2 голосов
/ 02 июня 2010

Вы можете реализовать IXmlSerializable и реализовать процедуру сериализации самостоятельно. Таким образом, вы можете избежать элемента.

Пример здесь: http://paltman.com/2006/jul/03/ixmlserializable-a-persistable-example/

0 голосов
/ 07 июня 2016

Я думаю, что присвоение нулевого значения полю адреса должно работать.

0 голосов
/ 15 июня 2010

Вы можете удалить пустое значение, добавив атрибут DefaultValue к свойству. Когда значение свойства соответствует значению по умолчанию, оно не сериализуется. Вы устанавливаете значение по умолчанию равным нулю, чтобы исключить сериализацию. Вот пример:


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

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

}
...