Преобразование класса в XML в строку - PullRequest
3 голосов
/ 19 октября 2011

Я использую XMLSerializer для сериализации класса в XML. Существует множество примеров для этого и сохранения XML в файл. Однако я хочу поместить XML в строку, а не сохранить его в файл.

Я экспериментирую с кодом ниже, но он не работает:

public static void Main(string[] args)
        {

            XmlSerializer ser = new XmlSerializer(typeof(TestClass));
            MemoryStream m = new MemoryStream();

            ser.Serialize(m, new TestClass());

            string xml = new StreamReader(m).ReadToEnd();

            Console.WriteLine(xml);

            Console.ReadLine();

        }

        public class TestClass
        {
            public int Legs = 4;
            public int NoOfKills = 100;
        }

Есть идеи как это исправить?

Спасибо.

Ответы [ 3 ]

10 голосов
/ 19 октября 2011

Вы должны поместить свой поток памяти обратно в начало до чтения следующим образом:

        XmlSerializer ser = new XmlSerializer(typeof(TestClass));
        MemoryStream m = new MemoryStream();

        ser.Serialize(m, new TestClass());

        // reset to 0 so we start reading from the beginning of the stream
        m.Position = 0;
        string xml = new StreamReader(m).ReadToEnd();

Кроме того, всегда важно закрыть ресурсы, вызвав dispose или close.Ваш полный код должен выглядеть примерно так:

        XmlSerializer ser = new XmlSerializer(typeof(TestClass));
        string xml;

        using (MemoryStream m = new MemoryStream())
        {
            ser.Serialize(m, new TestClass());

            // reset to 0
            m.Position = 0;
            xml = new StreamReader(m).ReadToEnd();
        }

        Console.WriteLine(xml);
        Console.ReadLine();
1 голос
/ 19 октября 2011

В классе TestClass отсутствует атрибут [Serializabe], и ​​вы должны установить позицию потока памяти в начало:

         XmlSerializer ser = new XmlSerializer(typeof(TestClass));
        MemoryStream m = new MemoryStream();
        ser.Serialize(m, new TestClass());
        m.Position = 0;
        string xml = new StreamReader(m).ReadToEnd();
        Console.WriteLine(xml);
        Console.ReadLine();
0 голосов
/ 19 октября 2011

Ваш поток памяти не закрыт и находится в конце (следующее доступное место для записи). Я думаю, что вы должны закрыть его или искать его начало. Как вы делаете, вы ничего не читаете, потому что вы уже в конце потока. Поэтому добавьте Seek () после сериализации объектов. Как это:

        XmlSerializer ser = new XmlSerializer(typeof(TestClass));
        MemoryStream m = new MemoryStream();

        ser.Serialize(m, new TestClass());

        m.Seek(0, SeekOrigin.Begin);   //<-- ADD THIS!

        string xml = new StreamReader(m).ReadToEnd();

        Console.WriteLine(xml);

        Console.ReadLine();
...