Сериализация объектов с использованием объектов xmlSerializer.Serialize и IEnumerable

У меня есть объект, который содержит объект, определенный как IEnumerable, т.е.

[Serializable]
[XmlRoot("MyObject")]
public class MyObject
{
    [XmlAttribute]
    public string Name { get; set; }

    [XmlArrayAttribute("Numbers")]
    public IEnumerable<string> Numbers { get; set; }
}

Когда я запускаю XmlSerializer.Serialize для объекта, т.е.

        MyObject myObject = new MyObject() { 
            Name = "My Name" ,
            Numbers= new List<string>(){"One", "Two"}
        };



     var xmlSerializer = XmlSerializer.FromTypes(new[] 
{ typeof(MyObject) })[0];
            using (var xmlWriter = XmlWriter.Create(@"MyObject.xml"))
            {
                if (xmlWriter != null) xmlSerializer.Serialize(xmlWriter, myObject);
            }

я получил

«Невозможно сериализовать элемент SerializeObjects.MyObject.Numbers типа System.Collections.Generic.IEnumerable`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], поскольку это интерфейс».

Как я понимаю, вы не можете сериализовать интерфейс.

Теперь вопрос:

Каково наилучшее объявление для «общедоступных номеров IEnumerable {get; set;}»?

Должен ли я использовать List<>, если нет, то почему?


person Coppermill    schedule 28.04.2010    source источник


Ответы (2)


В общих чертах, вы должны использовать Collection<T>, если вы хотите, чтобы пользователи вашего класса могли свободно изменять его, или ReadOnlyCollection<T>, если вы этого не делаете. Не рекомендуется использовать List<T> в общедоступных интерфейсах (источник).

Однако, поскольку этот класс предназначен для сериализации XML и, следовательно, предположительно не используется ни для каких других целей, кроме представления XML в качестве объектной модели, правила на самом деле не применяются так же, как «обычный» API, потому что он не будет иметь потребители, отличные от XmlSerializer, поэтому не так уж важно, что вы используете. Хотя я бы все же придерживался рекомендаций.

person Greg Beech    schedule 28.04.2010

Если вы не возражаете против того, чтобы список редактировался, т. е. добавление/удаление публично, тогда List<> будет нормально. В противном случае вы должны использовать ReadOnlyCollection

person James    schedule 28.04.2010