2012-03-23 10 views
13

Internamente, JsonConvert.SerializeObject(obj, Formatting.Indented) se reduce aJson.Net no serializar a un arroyo, pero funciona muy bien serialización en una cadena

JsonSerializer jsonSerializer = JsonSerializer.Create(null); 
StringWriter stringWriter = new StringWriter(new StringBuilder(256), (IFormatProvider) CultureInfo.InvariantCulture); 
using (JsonTextWriter jsonTextWriter = new JsonTextWriter((TextWriter) stringWriter)) 
{ 
    jsonTextWriter.Formatting = formatting; 
    jsonSerializer.Serialize((JsonWriter) jsonTextWriter, value); 
} 
return stringWriter.ToString(); 

Esto funciona muy bien. Sin embargo, si hago lo siguiente:

string json; 

JsonSerializer jsonSerializer = JsonSerializer.Create(); 

using (var stream = new MemoryStream()) 
using (var streamWriter = new StreamWriter(stream, Encoding.UTF8)) 
using (var jsonWriter = new JsonTextWriter(streamWriter)) 
{ 
    serializer.Serialize(jsonWriter, cmd); 

    stream.Position = 0; 
    using (var reader = new StreamReader(stream)) 
    { 
     json = reader.ReadToEnd(); 
    } 
} 

A continuación, el valor de json es "". ¿Alguien puede señalarme mi error?

+0

intente llamar a Flush() en el escritor; –

Respuesta

17

El problema es que no se haya vaciado la streamWriter después de escribir:

serializer.Serialize(jsonWriter, cmd); 
streamWriter.Flush(); 
stream.Position = 0; 

Por otra parte, ¿por qué no usar un StringWriter para empezar?

using (var writer = new StringWriter()) 
{ 
    using (var jsonWriter = new JsonTextWriter(writer)) 
    { 
     serializer.Serialize(jsonWriter, cmd); 
     Console.WriteLine(writer.ToString()); 
    } 
} 
+0

Aha! * Fue * el color faltante. Gracias. En cuanto a la secuencia contra la secuencia, en realidad no estoy interesado en una representación de cadena. Me están pasando una transmisión que necesito completar. Sin embargo, originalmente hice una prueba con cadenas para saber en qué me estaba metiendo, y cuando la versión de transmisión comparable no funcionó, me confundí. – moswald

2

supongo que o bien JsonTextWriter o StreamWriter hacer algo de búfer interno. Por lo tanto, intente vaciar el jsonWriter y/o el streamWriter antes de leer desde la secuencia de memoria subyacente.

Cuestiones relacionadas