Why this works:
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();
}
}
}
but this does not work ("Cannot access a closed Stream."):
Only difference is var dummy = XmlWriter.Create(ms)
instead of 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();
}
}
}
Stack trace:
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:
Also this does not work (same error):
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();
}
}
}
Stack trace:
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:
but this works (only difference is 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();
}
}
What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.
Compared to other languages—like Java, PHP, or C#—C is a relatively simple language to learn for anyone just starting to learn computer programming because of its limited number of keywords.
In C programming language, %d and %i are format specifiers as where %d specifies the type of variable as decimal and %i specifies the type as integer. In usage terms, there is no difference in printf() function output while printing a number using %d or %i but using scanf the difference occurs.
In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.
just move reading from MemoryStream block on one level with writing to it.
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();
}
}
Can you give us the complete stack trace of the exception? My first guess is that the XmlWriter
still tries to access the stream within the Dispose()
method of the XmlWriter
.
In your second and fourth code example you place the StreamReader
in a using-block. This causes the invocation of the Dispose()
method of the StreamReader
at the end of this block. This method closes both the reader and the underlying stream. After this, the Dispose()
method of the XmlWriter
can't access the stream anymore.
Update:
Based on the stackstrace it seems I was right. The Dispose()
method invokes Close()
, which in turn wants to flush an already closed stream. This looks like a bug since there should be nothing left to flush.
You already gave the solution: don't close the memorystream before the XmlWriter disposes.
(I assume you know that a using-block implicitly disposes the used object, and that disposing a StreamReader
or StreamWriter
implicitly disposes (and closes) the underlying stream.)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With