2011-03-22 46 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