2011-03-22 21 views
14

estoy recibiendo el mensaje "Stream no era legible" en la declaración:Stream no fue un error legible

using (StreamReader sr = new StreamReader(ms)) 

He probado los consejos publicados aquí sin éxito. Gracias por la ayuda.

Este es mi código:

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

código con formato sería más fácil de seguir y ayudar a depurar – BrMcMullin

+1

StreamWriter y StreamReader tanto cerrar la secuencia subyacente cuando son desechados, como tal, cuando se llega a tratar de leer de la corriente que estaba cerrada cuando eliminado el StreamWriter, la transmisión ya no está abierta para lectura o escritura. Lamentablemente, no estoy en mi computadora ahora, pero otras respuestas en este sitio tienen clases para envolver el flujo subyacente para evitar que se cierre. –

+0

Una clase contenedora se puede encontrar vinculada a esta respuesta mía anterior: http://stackoverflow.com/questions/5261123/why-is-my-filestream-object-being-disposed-of-when-im-using- a-binaryreader-obj/5261202 # 5261202 –

Respuesta

16

Cuando este bloque de código completa, sino que también disponer el MemoryStream adjunta

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

Retire la instrucción using, y disponer la corriente manualmente después de que esté hecho con él

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

En .Net 4.5 hay una sobrecarga de StreamWriter donde se puede especificar que deje la ruta abierta: https://msdn.microsoft.com/EN-US/library/gg712853(v=VS. 110, d = hv.2) .aspx – user3285954

+1

Y no olvides encerrar todo en el bloque 'try/finally' y agrega' sw.Dispose() 'en el bloque' finally'. Deberá definir 'StreamWriter sw' fuera del bloque' try/finally'. – Gabrielius

2

Prueba este lugar (suponiendo conflictos es de tipo List<Conflict>):

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

¿Esto solo funcionará con una colección genérica? Estoy atrapado en este momento con .Net 1.1. –

Cuestiones relacionadas