XmlSerializer
разработан, чтобы быть очень прямой перевод ваших объектов в XML; вы может использовать IXmlSerializable
, но это редко стоит. Вам лучше создать объекты, которые отражают структуру xml. Или, проще - использовать XSD, чтобы сделать это для вас:
xsd example.xml
xsd example.xsd /classes
Или я подозреваю, следующее будет работать (непроверенные):
using System.Collections.Generic;
using System.Xml.Serialization;
public class FavoriteSettings
{
[XmlArray("Customer")]
[XmlArrayItem("ID")]
public List<int> Customers { get; set; }
[XmlArray("Supplier")]
[XmlArrayItem("ID")]
public List<int> Suppliers { get; set; }
}
В частности, если вы хотите, чтобы элемент («Клиент» и т. д.) менялся в зависимости от данных («Имя» и т. д.) - тогда он не будет работать, если вы не используете IXmlSerializable
или напишите его сами с помощью XDocument
(или аналогичного). Для простых данных, подобных этому, возможно, XDocument
является жизнеспособным вариантом? Но тогда вы делаете много дополнительной работы, особенно во время десериализации.
Вот пример использования вашего существующего класса с помощью LINQ к XML:
static class Program
{
static void Main() {
var favs = new FavouriteSettings
{
bigList = new List<FavouriteList>
{
new FavouriteList {
Name = "Customer",
aList = new List<int>{
12,2,5
}
}, new FavouriteList {
Name = "Supplier",
aList = new List<int>{
158, 23, 598
}
}
}
};
var el = new XElement("FavoriteSettings",
from fav in favs.bigList
select new XElement(fav.Name,
from item in fav.aList
select new XElement("ID", item)));
string xml = el.ToString();
Console.WriteLine(xml);
el = XElement.Parse(xml);
favs = new FavouriteSettings
{
bigList = new List<FavouriteList>(
from outer in el.Elements()
select new FavouriteList
{
Name = outer.Name.LocalName,
aList = new List<int>(
from id in outer.Elements("ID")
select (int)id
)
})
};
}
}
(добавлен второй пример, показывающий, LINQ к XML с существующими типами) –