2011-10-19 151 views
3

我正在使用XMLSerializer将类序列化为XML。有很多这样的例子,并将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; 
     } 

关于如何解决此问题的任何想法?

谢谢。

回答

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或关。你的完整代码应该是这样的:

 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

还有的[Serializabe]属性缺少类TestClass中,你必须对内存流的位置设置为开头:

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