Попытка сериализовать объект в поток с помощью Newtonsoft, получение пустого потока

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