Попытка сериализации объекта в поток с помощью Newtonsoft, получение пустого потока - PullRequest
2 голосов
/ 15 марта 2019

У меня есть пример программы:

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

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вам нужно очистить писателя.

new JsonSerializer().Serialize(jsonWriter, new { name = "Jamie" });
jsonWriter.Flush();
1 голос
/ 15 марта 2019

Вам необходимо очистить 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() + ")");
    }
}
...