将类转换为XML到字符串

本文关键字:字符串 XML 转换 | 更新日期: 2023-09-27 18:11:44

我使用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;
        }

有什么建议吗?

谢谢。

将类转换为XML到字符串

你必须在阅读之前将你的记忆流定位到开头:

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

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

内存流未关闭,位于末尾(下一个可写入的位置)。我猜你必须关闭它,或者寻找它的开始。你这样做的方式是你什么都不读,因为你已经在流的末尾了。因此,在序列化对象之后添加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();