2012-03-23 7 views
13

Wewnętrznie JsonConvert.SerializeObject(obj, Formatting.Indented) sprowadza się doJson.Net nie serializacji do strumienia, ale działa dobrze szeregowania na ciąg

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

to działa dobrze. Jednakże, jeśli wykonaj następujące czynności:

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

Następnie wartość json jest "". Czy ktoś może wskazać mi mój błąd?

+0

Spróbuj wywołać Flush() na pisarzu; –

Odpowiedz

17

Problem polega na tym, że nie spłukuje streamWriter po napisaniu:

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

Alternatywnie, dlaczego nie wystarczy użyć StringWriter zacząć?

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

Aha! To * było * brakującym Flushem. Dzięki. Jeśli chodzi o strumień i string, nie interesuję się reprezentacją ciągów. Otrzymuję strumień, który muszę wypełnić. Jednak początkowo testowałem używając łańcuchów tylko po to, aby wiedzieć, w co się pakuję, a gdy porównywana wersja strumienia nie działała, byłem zdezorientowany. – moswald

2

myślę, że albo JsonTextWriter lub StreamWriter zrobić wewnętrznego buforowania. Więc spróbuj spłukać jsonWriter i/lub streamWriter przed odczytaniem z podstawowego strumienia pamięci.

Powiązane problemy