Сериализация объектов с помощью объектов 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 of тип System.Collections.Generic.IEnumerable`1 [[System.String, mscorlib, Version = 2.0.0.0, Culture = нейтрально, PublicKeyToken = b77a5c561934e089]] потому что это интерфейс".
Что я понимаю, что вы не можете сериализовать интерфейс.
Теперь на вопрос:
Какое лучшее объявление для "общедоступных IEnumerable Numbers {get; set;}"?
Должен ли я использовать List<>
, если нет, то почему?
Ответы
Ответ 1
В общих чертах вы должны использовать Collection<T>
, если вы хотите, чтобы пользователи вашего класса могли свободно его изменять, или ReadOnlyCollection<T>
, если вы этого не сделаете. Не рекомендуется использовать List<T>
в общедоступных интерфейсах (источник).
Однако, поскольку этот класс предназначен для Сериализации XML и, следовательно, предположительно не используется для каких-либо целей, кроме представления XML в качестве объектной модели, правила действительно не применяются так же, как "нормальный" API, поскольку он не будут иметь других потребителей, кроме XmlSerializer
, и поэтому на самом деле это не так важно, что вы используете. Я бы, вероятно, все еще придерживался рекомендаций.
Ответ 2
Если вы не возражаете, чтобы список редактировался, то есть добавление/удаление публично, тогда List<>
будет в порядке. В противном случае вы должны использовать ReadOnlyCollection