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

を、それが処分のいずれかを呼び出すことによってリソースをクローズすることは常に重要ですか閉じる。完全なコードは次のようなものにしてください:

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