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-to-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
)
})
};
}
}