【问题标题】:Trying to serialize an object to a stream using Newtonsoft, getting an empty stream尝试使用 Newtonsoft 将对象序列化为流,得到一个空流
【发布时间】:2019-03-15 14:02:16
【问题描述】:

我有一个程序示例:

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

【问题讨论】:

    标签: c# serialization stream json.net


    【解决方案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() + ")");
        }
    }
    

    【讨论】:

    • 您能否在问题中链接到小提琴的分支,以显示这是如何完成的?
    • 非常感谢!
    • 还意识到您需要在写入器上调用 Flush() 以使其写入实际的内存流,因为它在写入之前缓存了一些数据。
    • @stuartd 在小提琴中尝试一下,看看你确实需要重置位置!两者都是必需的。
    【解决方案2】:

    你需要冲洗你的作家。

    new JsonSerializer().Serialize(jsonWriter, new { name = "Jamie" });
    jsonWriter.Flush();
    

    【讨论】:

      猜你喜欢
      • 2018-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多