2012-05-04 20 views
31

オブジェクトをXML文字列に書き込み、その文字列をデータベースに保存しようとしています。しかし、まず文字列を取得する必要があります。メモリストリームから文字列への読み込み

private static readonly Encoding LocalEncoding = Encoding.UTF8; 

    public static string SaveToString<T> (T settings) 
    { 
     Stream stream = null; 
     TextWriter writer = null; 
     string settingsString = null; 

     try 
     { 
      stream = new MemoryStream(); 

      var serializer = new XmlSerializer(typeof(T)); 

      writer = new StreamWriter(stream, LocalEncoding); 

      serializer.Serialize(writer, settings); 

      var buffer = new byte[stream.Length]; 

      stream.Read(buffer, 0, (int)stream.Length); 

      settingsString = LocalEncoding.GetString(buffer); 
     } 
     catch(Exception ex) 
     { 
      // If the action cancels we don't want to throw, just return null. 
     } 
     finally 
     { 
      if (stream != null) 
       stream.Close(); 

      if(writer != null) 
       writer.Close(); 
     } 

     return settingsString; 
    } 

これは動作しているようですが、ストリームはバイトで埋められます。しかし、私はそれをバッファーに読み込んでから文字列に戻すと、バッファーは '0'で埋められます!私はここで間違って何をしているか分からない。

+1

可能重複[あなたはMemoryStreamをから文字列を取得するにはどうすればよい?](http://stackoverflow.com/questions/78181/how-do-you-get-a-string-from -a-memorystream) – andyp

答えて

64

stream.Readの結果を確認した場合、ストリームを巻き戻していないため、何も読み取られていないことがわかりました。 (あなたはstream.Position = 0;でこれを行うことができます。)しかし、それだけでToArrayを呼び出すために簡単です:

settingsString = LocalEncoding.GetString(stream.ToArray()); 

(あなたはMemoryStreamStreamからstreamの種類を変更する必要がありますが、それは同じ方法でだとして、それは大丈夫ですどこに作成するか)

StreamWriterの代わりにStringWriterを使用することもできます。 UTF-16ではなくUTF-8を使用する場合は、サブクラスを作成する必要がありますが、これは簡単です。例については、this answerを参照してください。

私はちょうどそれが方法によって無害なものを、意味を想定しExceptionをキャッチしている方法によって心配です - でも、何もログインせず。 usingのステートメントは、明示的なfinallyブロックを書くよりも一般的にきれいです。

+0

ありがとう:)それは素早い作業です。私は使用ブロックがもっと普遍的であることを知っています。しかし、私はこれが私に与える平坦さがとても好きです。どちらがスタイルのものです。私はStringWriterがあったのかどうか分かりませんでしたが、はるかに簡単ですが、私はencoingを指定する機能が好きです。おそらく、新しいクラスではなく、これに対してオーバーロードを追加するでしょう。 – tigerswithguitars

+0

@tigerswithguitars: 'StringWriter'自体にどのように過負荷を追加しようとしていますか?新しいクラスのポイントは、 'StringWriter'は常に' TextWriter.Encoding'プロパティからUTF-16を返します。余分なクラスはそのプロパティを単にオーバーライドします。 –

+0

申し訳ありませんが、私の言葉は混乱していました。私は自分のメソッドにオーバーロードを追加してエンコーディングを指定します。 – tigerswithguitars

8
string result = System.Text.Encoding.UTF8.GetString(fs.ToArray()); 
+1

このコードサンプルでは質問に答える可能性がありますが、ここでの回答に必須の説明を含めることをお勧めします。 –

+0

ここに「茎」とは何ですか?変数の場合、どのようにインスタンス化しましたか? 'fs'と同じ質問です。 –

+0

ユーザーはシステムの代わりに間違ってステムを使用していました – Prasanth

1
string result = Encoding.UTF8.GetString((stream as MemoryStream).ToArray()); 
+0

ここでは 'as 'の使用に疑問があります。まず、あなたはストリームが 'MemoryStream'であることを知っています。プラスでもなくても、' GetString'に 'null'を渡すと例外がスローされるので、最初は明示的キャストを使うことができます。 –

+1

このコードは質問に答えるかもしれませんが、なぜこのコードが質問に答えるか、および/またはどのようにして追加の文脈を提供するかによって、長期的な価値が向上します。 – ryanyuyu

関連する問題