Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CoppermillОтветов: 2

У меня есть объект, который содержит объект, определенный как 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<>, если нет, то почему?

interfaceserialization

Ответы

Ответ 1 · рейтинг 9 · Greg Beech

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

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

Ответ 2 · рейтинг 1 · James

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы