#c# #serialization #stream #json.net
#c# #сериализация #поток #json.net
Вопрос:
У меня есть пример программы:
using System;
using Newtonsoft.Json;
using System.IO;
public class Program
{
public static void Main()
{
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
using (var jsonWriter = new JsonTextWriter(writer))
{
new JsonSerializer().Serialize(jsonWriter, new { name = "Jamie" });
Console.WriteLine("stream length: " stream.Length); // stream length: 0
Console.WriteLine("stream position: " stream.Position); // stream position: 0
Console.WriteLine("stream contents: (" reader.ReadToEnd() ")"); // stream contents: ()
}
}
}
Это должно (согласно этой странице: https://www.newtonsoft.com/json/help/html/SerializingJSON.htm ) создайте поток, содержащий представление объекта в формате JSON: obj
но на самом деле поток, похоже, имеет длину 0
и является пустой строкой при записи. Что я могу сделать для достижения правильной сериализации?
Вот пример запущенной программы: https://dotnetfiddle.net/pi1bqE
Ответ №1:
Вам нужно сбросить JsonSerializer, чтобы убедиться, что это действительно записанные данные в базовый поток. Поток будет находиться в конечной позиции, поэтому вам нужно будет перемотать его обратно в начальную позицию, чтобы прочитать данные.
public static void Main()
{
using (var stream = new MemoryStream())
using (var reader = new StreamReader(stream))
using (var writer = new StreamWriter(stream))
using (var jsonWriter = new JsonTextWriter(writer))
{
new JsonSerializer().Serialize(jsonWriter, new { name = "Jamie" });
jsonWriter.Flush();
stream.Position = 0;
Console.WriteLine("stream contents: (" reader.ReadToEnd() ")");
}
}
Комментарии:
1. Не будете ли вы любезны сослаться на форк скрипки в вопросе, показывающий, как это делается?
2. Большое вам спасибо!
3. Также понял, что вам нужно будет вызвать Flush () на writer, чтобы заставить его записывать в фактический поток памяти, поскольку он кэширует некоторые данные перед их записью.
4. @stuartd Попробуйте это в скрипте и увидите, что вам действительно нужно сбросить позицию! Требуются оба.
Ответ №2:
Вам нужно очистить свой writer.
new JsonSerializer().Serialize(jsonWriter, new { name = "Jamie" });
jsonWriter.Flush();