У меня есть объект, который содержит объект, который является definded как IEnumerable, т.е.
[Serializable]
[XmlRoot("MyObject")]
public class MyObject
{
[XmlAttribute]
public string Name { get; set; }
[XmlArrayAttribute("Numbers")]
public IEnumerable<string> Numbers { get; set; }
}
Когда я выполняю XmlSerializer. Сериализируйте против объекта, т.е.
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. Числа системы типов. Наборы. Универсальный. IEnumerable '1 [[Система. Строка, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], потому что это - интерфейс".
Который я понимаю, что Вы не можете сериализировать интерфейс.
Теперь для вопроса:
Что является лучшим объявлением для "общедоступных Чисел IEnumerable {добираются; набор;}"?
Если я использую List<>
, если не, почему нет?
В общих чертах вы должны использовать Collection
, если вы хотите, чтобы пользователи вашего класса могли свободно изменять его, или ReadOnlyCollection
, если вы этого не сделаете. Не рекомендуется использовать List
в публичных интерфейсах ( источник ).
Однако, поскольку этот класс предназначен для сериализации XML и, следовательно, предположительно не используется ни для каких других целей, кроме представления XML в качестве объектной модели, правила на самом деле не применяются так же, как «нормальный» API, потому что он не будет иметь других потребителей, кроме XmlSerializer
, поэтому на самом деле не имеет большого значения, что вы используете. Хотя я бы, наверное, по-прежнему придерживался рекомендаций.
Если вы не против того, чтобы список можно было редактировать, т.е. добавлять/удалять публично, то List<>
вполне подойдет. В противном случае вам следует использовать ReadOnlyCollection