Pol*_*Pol 7 c# silverlight xmlwriter using
为什么这样有效:
using (var ms = new MemoryStream())
{
using (var dummy = new StreamWriter(ms))
{
var sw = new StreamWriter(ms);
sw.WriteLine("Hello World");
sw.Flush();
using (StreamReader rdr = new StreamReader(ms))
{
ms.Position = 0;
textBoxExc.Text = rdr.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用("无法访问封闭的流."):只有差异var dummy = XmlWriter.Create(ms)
而不是var dummy = new StreamWriter(ms)
using (var ms = new MemoryStream())
{
using (var dummy = XmlWriter.Create(ms))
{
var sw = new StreamWriter(ms);
sw.WriteLine("Hello World");
sw.Flush();
using (StreamReader rdr = new StreamReader(ms))
{
ms.Position = 0;
textBoxExc.Text = rdr.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
System.ObjectDisposedException was unhandled by user code
Message=Cannot access a closed Stream.
ObjectName=""
StackTrace:
w System.IO.__Error.StreamIsClosed()
w System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
w System.Xml.XmlUtf8RawTextWriter.FlushBuffer()
w System.Xml.XmlUtf8RawTextWriter.Flush()
w System.Xml.XmlWellFormedWriter.Close()
w System.Xml.XmlWriter.Dispose(Boolean disposing)
w System.Xml.XmlWriter.Dispose()
w SerializeTest.MainPage.buttonExc_Click(Object sender, RoutedEventArgs e)
w System.Windows.Controls.Primitives.ButtonBase.OnClick()
w System.Windows.Controls.Button.OnClick()
w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
InnerException:
Run Code Online (Sandbox Code Playgroud)
这也行不通(同样的错误):
using (var ms = new MemoryStream())
{
using (var writer = XmlWriter.Create(ms))
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(writer, objectToSave);
writer.Flush();
ms.Position = 0;
using (StreamReader rdr = new StreamReader(ms))
{
return rdr.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
System.ObjectDisposedException was unhandled by user code
Message=Cannot access a closed Stream.
ObjectName=""
StackTrace:
w System.IO.__Error.StreamIsClosed()
w System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count)
w System.Xml.XmlUtf8RawTextWriter.FlushBuffer()
w System.Xml.XmlUtf8RawTextWriter.Flush()
w System.Xml.XmlWellFormedWriter.Close()
w System.Xml.XmlWriter.Dispose(Boolean disposing)
w System.Xml.XmlWriter.Dispose()
w SerializeTest.SerializeToStringTest[T](T objectToSave)
w SerializeTest.MainPage.button2A_Click(Object sender, RoutedEventArgs e)
w System.Windows.Controls.Primitives.ButtonBase.OnClick()
w System.Windows.Controls.Button.OnClick()
w System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs e)
w System.Windows.Controls.Control.OnMouseLeftButtonUp(Control ctrl, EventArgs e)
w MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)
InnerException:
Run Code Online (Sandbox Code Playgroud)
但这个工程(唯一的区别是StreamReader
W/O using
):
using (var ms = new MemoryStream())
{
using (var writer = XmlWriter.Create(ms))
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(writer, objectToSave);
writer.Flush();
ms.Position = 0;
StreamReader rdr = new StreamReader(ms);
return rdr.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
小智 14
只需将MemoryStream块中的读取移到一个级别上即可.
using (var ms = new MemoryStream())
{
using (var writer = XmlWriter.Create(ms))
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(writer, objectToSave);
writer.Flush();
ms.Position = 0;
}
using (StreamReader rdr = new StreamReader(ms))
{
return rdr.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
您能给我们异常的完整堆栈跟踪吗?我的第一个猜测是,仍然尝试在的方法XmlWriter
中访问流 。Dispose()
XmlWriter
在第二个和第四个代码示例中,您将其放置StreamReader
在 using 块中。这会导致调用该块末尾Dispose()
的方法。StreamReader
此方法会关闭读取器和底层流。此后,该Dispose()
方法将XmlWriter
无法再访问该流。
更新:
根据 stackstrace 看来我是对的。该Dispose()
方法调用Close()
,而该方法又想要刷新已经关闭的流。这看起来像一个错误,因为应该没有什么可以刷新的。
您已经给出了解决方案:在 XmlWriter 释放之前不要关闭内存流。
(我假设您知道 using 块隐式处置已使用的对象,并且处置 aStreamReader
或StreamWriter
隐式处置(并关闭)底层流。)
归档时间: |
|
查看次数: |
4008 次 |
最近记录: |