Как не написать элемент на основе значения с XmlSerializer? - PullRequest
3 голосов
/ 04 января 2012

Я могу использовать [XmlIgnore], чтобы не записывать элементы, но как я могу управлять этим на основе содержимого переменной?

Например, я не хочу писать элемент XML, когдазначение равно нулю.

[XmlRootAttribute("Component", IsNullable = true)]
public class Component {
    [XmlArrayAttribute("worlds_wola", IsNullable = true)]
    public List<Hello> worlds;      
    public int? a = null;
    public int? b = null;

    public Component()
    {
        worlds = new List<Hello>() {new Hello(), new Hello()}; 
    }
}

Однако я получил этот XML.

<worlds_wola>
  ...
</worlds_wola>
<a xsi:nil="true" />
<b xsi:nil="true" />

Есть ли способ не получить элемент, который не имеет никакого значения, такого как "<a/>" или "<b/> "

Ответы [ 2 ]

2 голосов
/ 04 января 2012

Включите свойство с именем aSpecified и типом bool и верните false, если a не должно быть частью сгенерированного xml:

public bool aSpecified
{
    get { return this.a.HasValue; }
}

Смотри также: https://stackoverflow.com/a/246359/295635

1 голос
/ 04 января 2012

Очевидно, XmlSerializer поддерживает методы ShouldSerialize:

Вы также можете использовать пользовательский код сериализации с IXmlSerializable или ISerializable.

Для небольших классов это достаточно просто, но в больших случаях это может быстро стать беспорядочным и хрупким.

Выможет также иметь возможность использовать конструктор XmlSerializer, который принимает переопределения атрибутов в зависимости от ваших обстоятельств:

...