尝试使用 Newtonsoft 将对象序列化为流,得到一个空流

Jam*_*lls 7 c# serialization stream 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: ()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

应该(根据此页面: https: //www.newtonsoft.com/json/help/html/SerializingJSON.htm)创建一个包含对象的 JSON 表示形式的流:obj但实际上该流似乎有长度0并且是写出时为空字符串。我该怎么做才能实现正确的序列化?

这是程序运行的示例: https: //dotnetfiddle.net/pi1bqE

Eri*_*oft 4

您需要刷新 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() + ")");
    }
}
Run Code Online (Sandbox Code Playgroud)