2012-03-23 21 views
13

は、内部の文字列にうまくシリアライズの作品、JsonConvert.SerializeObject(obj, Formatting.Indented)これはうまく動作しますJson.Netストリームにシリアル化するために失敗しますが、

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

に沸きます。私は次の操作を行う場合は、:

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

を次にjsonの値は""です。誰かが私の間違いを指摘できますか?

+0

ライターでFlush()を呼び出してみてください。 –

答えて

17

問題は、あなたが書き込み後streamWriterをフラッシュされていないということです。また

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

、なぜだけで開始するStringWriterを使用していませんか?

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

Aha!それは行方不明だった*。ありがとう。ストリーム対ストリングのことについては、私は実際にストリング表現に興味がありません。私は満たす必要があるストリームを渡されています。しかし、私はもともと文字列を使ったテストを行ったので、私が何を得ているのか分かりました。そして、同等のストリームバージョンがうまくいかなかったとき、私は混乱しました。 – moswald

2

私はJsonTextWriterまたはStreamWriterのいずれかは、いくつかの内部バッファリングを行うことを推測します。したがって、基礎となるメモリストリームから読み取る前に、jsonWriterおよび/またはstreamWriterをフラッシュしてください。

関連する問題