将Class转换为XML为string

时间:2011-10-19 07:36:04

标签: c# .net xml xml-serialization xmlserializer

我正在使用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 个答案:

答案 0 :(得分:10)

在阅读之前,你必须将你的记忆流放回到开头:

        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 :(得分:1)

类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();

答案 2 :(得分:-4)

您的内存流未关闭,并且位于末尾(下一个可写入位置)。我的猜测是你必须关闭它,或者寻求它的开始。你做的方式是因为你已经在流的末尾而没有阅读任何内容。因此,在序列化对象后添加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();