Сериализация объектов с использованием объектов xmlSerializer.Serialize и IEnumerable - PullRequest
11 голосов
/ 28 апреля 2010

У меня есть объект, который содержит объект, который определен как 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 of тип System.Collections.Generic.IEnumerable`1 [[System.String, mscorlib, версия = 2.0.0.0, Culture = нейтрально, PublicKeyToken = b77a5c561934e089]] потому что это интерфейс. "

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

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

Как лучше всего объявить "публичные IEnumerable Numbers {get; set;}"?

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

Ответы [ 2 ]

8 голосов
/ 28 апреля 2010

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

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

1 голос
/ 28 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...