Есть ли атрибут для пропуска пустых массивов в xml-сериализации c #? - PullRequest
8 голосов
/ 19 декабря 2008

Есть ли атрибут для пропуска пустых массивов в xml-сериализации c #? Это повысило бы удобочитаемость вывода xml.

1 Ответ

17 голосов
/ 19 декабря 2008

Ну, вы можете добавить ShouldSerializeFoo() метод:

using System;
using System.ComponentModel;
using System.Xml.Serialization;
[Serializable]
public class MyEntity
{
    public string Key { get; set; }

    public string[] Items { get; set; }

    [EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
    public bool ShouldSerializeItems()
    {
        return Items != null && Items.Length > 0;
    }
}

static class Program
{
    static void Main()
    {
        MyEntity obj = new MyEntity { Key = "abc", Items = new string[0] };
        XmlSerializer ser = new XmlSerializer(typeof(MyEntity));
        ser.Serialize(Console.Out, obj);
    }
}

Паттерн ShouldSerialize{name} распознается, и вызывается метод, чтобы определить, следует ли включить свойство в сериализацию. Существует также альтернативный шаблон {name}Specified, который позволяет также обнаруживать вещи при десериализации (через установщик):

[EditorBrowsable(EditorBrowsableState.Never), Browsable(false)]
[XmlIgnore]
public bool ItemsSpecified
{
    get { return Items != null && Items.Length > 0; }
    set { } // could set the default array here if we want
}
...