2012-05-04 169 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()); 

(你需要從Stream改變stream類型MemoryStream,不過沒關係,因爲它是在相同的方法)

或者 - 甚至更簡單 - 只需使用StringWriter而不是StreamWriter。如果你想使用UTF-8而不是UTF-16,你需要創建一個子類,但這很容易。一個例子見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',再加上即使不是這樣,將'null'傳遞給'GetString'將會拋出一個異常,所以你最好使用一個明確的強制轉換。 –

+1

雖然此代碼可能會回答問題,但爲何和/或代碼如何回答問題提供其他上下文可提高其長期價值。 – ryanyuyu