как сериализовать список <t>?

<p>у меня есть класс а. класс в и класс с являются частью класса а.</p><pre><code>class a { //few properties of class a list<typeof(b)> list1 = new list<typeof(b)>() list<typeof(c)> list2 = new list<typeof(c)>() nsystem notsystem { get; set; } // enum property type } public enum nsystem { a = 0, b = 1, c = 2 } </code></pre><p>я хочу сериализировать класс a и хочу создавать xml с ним; я также хочу сериализовать list1 и list2, а также enum ...</p><p>что такое хороший подход к сериализации этого xml, потому что мне нужна функциональность преобразования объекта в xml и xml в объект ...</p><p>какие есть хорошие варианты для этого? спасибо</p>

<p>вы можете использовать <a href="http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx">xmlserializer</a> :</p><pre><code>var aserializer = new xmlserializer(typeof(a)); stringbuilder sb = new stringbuilder(); stringwriter sw = new stringwriter(sb); aserializer.serialize(sw, new a()); // pass an instance of a string xmlresult = sw.getstringbuilder().tostring(); </code></pre><p>чтобы это работало должным образом, вам также понадобятся xml-аннотации для ваших типов, чтобы обеспечить сериализацию с правильными именами, т.е.</p><pre><code>public enum nsystem { a = 0, b = 1, c = 2 } [serializable] [xmlroot(elementname = "a")] class a { //few properties of class a [xmlarrayitem("listofb")] list<b> list1; [xmlarrayitem("listofc")] list<c> list2; nsystem notsystem { get; set; } } </code></pre><p><strong> edit: </strong></p><p>свойства <code>enum</code> по умолчанию сериализуются с именем свойства как содержащего элемент xml и его значением перечисления как значением xml, т. е. если свойство <code>notsystem</code> в вашем примере имеет значение <code>c</code>, оно будет сериализовано как</p><pre><code><notsystem>c</notsystem> </code></pre><p>конечно, вы всегда можете изменить способ сериализации свойства, сделав правильную аннотацию, т.е. используя <code>[xmlattribute]</code>, чтобы он сериализовался как атрибут, или <code>[xmlelement("foobar")]</code>, чтобы он сериализовался, используя <code>foobar</code> в качестве имени элемента. более обширная документация доступна на msdn, проверьте ссылку выше.</p>

<p>простой способ сделать <strong>двоичный код</strong> сериализация <strong>любого объекта</strong> с io перехватом ошибок.</p><pre><code>list<cookie> asdf = new list<cookie>(); //serialization serializer.save("data.bin", asdf); //deserialization asdf = serializer.load<list<cookie>>("data.bin"); </code></pre><p>класс сериализатора:</p><pre><code>public static class serializer { public static void save(string filepath, object objtoserialize) { try { using (stream stream = file.open(filepath, filemode.create)) { binaryformatter bin = new binaryformatter(); bin.serialize(stream, objtoserialize); } } catch (ioexception) { } } public static t load<t>(string filepath) where t : new() { t rez = new t(); try { using (stream stream = file.open(filepath, filemode.open)) { binaryformatter bin = new binaryformatter(); rez = (t) bin.deserialize(stream); } } catch (ioexception) { } return rez; } } </code></pre>

<p>вы можете использовать это</p><pre><code> [xmlarray("array\_name")] [xmlarrayitem("item\_in\_array")] public list<t> \_list; </code></pre>

<pre><code> public ilist<object> deserialize(string a\_filename) { xmlserializer deserializer = new xmlserializer(typeof(list<object>)); textreader reader = new streamreader(a\_filename); object obj = deserializer.deserialize(reader); reader.close(); return (list<object>)obj; } public void serialization(ilist<object> a\_stations,string a\_filename) { xmlserializer serializer = new xmlserializer(typeof(list<object>)); using (var stream = file.openwrite(a\_filename)) { serializer.serialize(stream, a\_stations); } } </code></pre>

<p>как предложил cloudraven, вы можете использовать двоичные представления. при поиске решений я наткнулся на <a href="http://www.dotnetperls.com/serialize-list">эту</a> ссылку. по сути, вы помечаете свой класс a как [serializable], и то же самое относится и к вашим классам b и c. тогда вы можете использовать такие функции, как <a href="https://msdn.microsoft.com/en-us/library/c5sbs8z9(v=vs.110).aspx">эти</a> для сериализации и десериализации</p>