Стандартный XmlSerializer:
public class Foo
{
public List<Bar> Bars { get; set; }
public string Name { get; set; }
}
public class Bar
{
public List<Zot> Zots { get; set; }
public string Name { get; set; }
}
public class Zot
{
public string Name { get; set; }
}
....
var f = new Foo
{
Name = "Foo",
Bars = new List<Bar>
{
new Bar
{
Name = "Bar1",
Zots = new List<Zot> {new Zot {Name = "Zot11"}, new Zot {Name = "Zot12"}}
},
new Bar
{
Name = "Bar2",
Zots = new List<Zot> {new Zot {Name = "Zot21"}, new Zot {Name = "Zot22"}}
}
}
};
var serializer = new XmlSerializer(typeof (Foo));
var sb = new StringBuilder();
using(var sw = new StringWriter(sb))
using(var xw = XmlWriter.Create(sw, new XmlWriterSettings{Indent = true, IndentChars = " "}))
serializer.Serialize(xw, f);
Console.WriteLine(sb);
Результат:
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Bars>
<Bar>
<Zots>
<Zot>
<Name>Zot11</Name>
</Zot>
<Zot>
<Name>Zot12</Name>
</Zot>
</Zots>
<Name>Bar1</Name>
</Bar>
<Bar>
<Zots>
<Zot>
<Name>Zot21</Name>
</Zot>
<Zot>
<Name>Zot22</Name>
</Zot>
</Zots>
<Name>Bar2</Name>
</Bar>
</Bars>
<Name>Foo</Name>
</Foo>
Для более тонкой настройки сериализации
используются атрибуты.
Только есть пара нюансов:
1. В случае вот такого варианта:
public class Foo
{
public IEnumerable<Bar> Bars { get; set; }
public string Name { get; set; }
}
....
var f = new Foo
{
Name = "Foo",
Bars = new List<Bar>
{
new Bar
{
Name = "Bar1",
Zots = new List<Zot> {new Zot {Name = "Zot11"}, new Zot {Name = "Zot12"}}
},
new Bar
{
Name = "Bar2",
Zots = new List<Zot> {new Zot {Name = "Zot21"}, new Zot {Name = "Zot22"}}
}
}.Select(b=>b)
};
конструктор XmlSerializer'а выкинет исключение, у которого внутри будет
{"Cannot serialize member FooLib.Foo.Bars of type System.Collections.Generic.IEnumerable`1[[FooLib.Bar, FooLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] because it is an interface."}
Т.е. отдаваемые наружу коллекции должны быть классами.
2. XML-сериализация очень тормозная. Я лично вместо нее использую JSON-сериализацию (в т.ч. для настроек) c помощью
JSON.Net - получается заметно быстрее XML. Хотя и здесь есть свои нюансы.