2011-03-22 47 views
14

我收到消息「流不可讀」的聲明:流未讀取錯誤

using (StreamReader sr = new StreamReader(ms)) 

我已經試過張貼在這裏沒有成功的祕訣。謝謝您的幫助。

這是我的代碼:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Conflict)); 
//Serialize Conflicts array to memorystream as XML 
using (MemoryStream ms = new MemoryStream()) 
{ 
    using (StreamWriter sw = new StreamWriter(ms)) 
    { 
     foreach (Conflict ct in Conflicts)  
      xmlSerializer.Serialize(sw, ct); 

     sw.Flush(); //Site tip 
     ms.Position = 0; //Site tip 
    } 
    //Retrieve memory stream to string 
    using (StreamReader sr = new StreamReader(ms)) 
    { 
     string conflictXml = String.Format(CultureInfo.InvariantCulture, "{0}</NewDataSet>", 
+1

格式化代碼會更容易跟蹤和幫助調試 – BrMcMullin 2011-03-22 20:36:32

+1

的StreamWriter和StreamReader的配置的時候都關閉底層流,因此,當你在試圖從被關閉的流中讀取時處理StreamWriter,流不再開放閱讀或寫作。不幸的是,我現在不在我的電腦上,但本網站上的其他答案都有用於封裝基礎流的類,以防止它被關閉。 – 2011-03-22 20:37:50

+0

可以發現一個包裝類鏈接到從我以前的答案:http://stackoverflow.com/questions/5261123/why-is-my-filestream-object-being-disposed-of-when-im-using- a-binaryreader-obj/5261202#5261202 – 2011-03-22 20:41:28

回答

16

當這個代碼塊完成後,它還將出售附加的MemoryStream

using (StreamWriter sw = new StreamWriter(ms)) 
    { 
foreach (Conflict ct in Conflicts)         xmlSerializer.Serialize(sw, ct); 
sw.Flush(); //Site tip 
ms.Position = 0; //Site tip 
} 

刪除using語句,並處分流,你是後手動用它做

StreamWriter sw = new StreamWriter(ms); 

    foreach (Conflict ct in Conflicts)         xmlSerializer.Serialize(sw, ct); 
    sw.Flush(); //Site tip 
    ms.Position = 0; //Site tip 

// other code that uses MemoryStream here... 

sw.Dispose(); 
+1

在.Net 4.5中,有一個StreamWriter超載,可以指定使流處於打開狀態:https://msdn.microsoft.com/EN-US/library/gg712853(v=VS。 110,d = hv.2).aspx – user3285954 2015-11-03 17:01:08

+1

不要忘記將所有內容都放在'try/finally'塊中,並在'finally'塊中添加'sw.Dispose()'。你需要在'try/finally'塊之外定義'StreamWriter sw'。 – Gabrielius 2018-02-09 15:49:44

2

試試這個,而不是(假設衝突是類型的List<Conflict>):

XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<Conflict>)); 
StringWriter sw = new StringWriter(); 
xmlSerializer.Serialize(sw, Conflicts); 
string conflictXml = sw.GetStringBuilder().ToString(); 
+0

這隻適用於通用集合嗎?我現在用.Net 1.1卡住了。 – 2011-03-23 16:40:45