2011-03-30 10 views
7

क्यों इस काम करता है: ("। एक बंद स्ट्रीम तक नहीं पहुंच पा")सी # का उपयोग कर + XmlWriter.Create = "एक बंद स्ट्रीम तक नहीं पहुंच सकता।"

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(); 
     } 
    } 
} 

लेकिन यह काम नहीं करता:

: केवल अंतर 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(); 
     } 
    } 
} 

स्टैक ट्रेस है

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: 

यह भी काम नहीं करता (एक ही त्रुटि):

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(); 
     } 
    } 
} 

स्टैक ट्रेस: ​​

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: 

लेकिन यह काम करता है (फर्क सिर्फ इतना है StreamReader है w/ओ 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(); 
    } 
} 
+1

सिल्वरलाइट 4 पर कोई रेपो नहीं, मुझे उम्मीद नहीं थी। –

+0

यह सिल्वरलाइट 3. – Pol

+0

आपको अपग्रेड करने का एक अच्छा कारण मिला। –

उत्तर

4

आप हमें अपवाद की पूरी स्टैक ट्रेस दे सकते हैं? मेरा पहला अनुमान यह है कि XmlWriterXmlWriter की Dispose() विधि के भीतर स्ट्रीम तक पहुंचने का प्रयास करता है।

अपने दूसरे और चौथे कोड उदाहरण में आप StreamReader को उपयोग-ब्लॉक में रखते हैं। इससे इस ब्लॉक के अंत में StreamReader की Dispose() विधि का आविष्कार होता है। यह विधि पाठक और अंतर्निहित धारा दोनों को बंद कर देती है। इसके बाद, Dispose()XmlWriter की विधि अब स्ट्रीम तक नहीं पहुंच सकती है।

अद्यतन: स्टैकस्ट्रेस के आधार पर ऐसा लगता है कि मैं सही था। Dispose() विधि Close() को आमंत्रित करती है, जो बदले में पहले से बंद स्ट्रीम को फ़्लश करना चाहता है। यह एक बग की तरह दिखता है क्योंकि फ्लश करने के लिए कुछ भी नहीं छोड़ा जाना चाहिए।

आपने पहले से ही समाधान दिया है: XmlWriter निपटान से पहले मेमोरीस्ट्रीम को बंद न करें।

(मैं आप जानते हैं कि एक का उपयोग कर ब्लॉक परोक्ष इस्तेमाल किया वस्तु disposes मान, और कहा कि निपटान एक StreamReader या StreamWriter परोक्ष disposes (और बंद कर देता है) अंतर्निहित धारा।)

+0

मैंने स्टैक ट्रेस जोड़ा। – Pol

13

सिर्फ एक पर 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(); 
    } 
} 
+0

बिल्कुल सही, एक स्ट्रिंग में XmlSchema प्राप्त करने का प्रयास करने में एक ही समस्या थी। एक बार जब मैं उस ब्लॉक को स्थानांतरित कर देता हूं तो यहां सबकुछ अच्छा था। – DubMan

संबंधित मुद्दे