2011-10-19 154 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();