【问题标题】:How to prevent Newtonsoft JsonSerializer to close the stream?如何防止 Newtonsoft JsonSerializer 关闭流?
【发布时间】:2017-12-18 03:02:10
【问题描述】:

所以我现在还没有编写我正在处理的代码,我正在研究如何最好地处理这个问题。

现在我有这个。

public static void WriteSymbol(Stream stream, Symbol symbol)
{
    using (var streamWriter = new StreamWriter(stream))
    {
        JsonSerializer.Create(SerializerSettings).Serialize(streamWriter, symbol);                
    }
}

我希望在测试完成后能够读取流的内容,以便检查集成。问题是现在在序列化之后,流被关闭了,我不能再从中读取了。

我看到了 JsonWriter public bool CloseOutput { get; set; },但我没有看到这个静态 JsonSerializer 的内容。

解决此问题的最佳方法是什么? 如何防止序列化程序关闭流? 有什么方法可以检查 Stream 的内容吗?

【问题讨论】:

  • 你确定是关闭它的序列化程序吗?
  • 我强烈怀疑 StreamWriter 是在这里关闭它的东西......请参阅@JeffE 链接到的问题 - 很有可能它会让你排序
  • @MarcGravell StreamWriter 上有构造函数参数。 LeaveOpen.
  • @ditoslav 根据 IL:1024

标签: c# stream json.net streamwriter jsonserializer


【解决方案1】:

从 .net 4.5 开始,您可以使用 StreamWriterLeaveOpen 构造函数参数。

StreamWriter 使用的默认缓冲区大小为 1024,在反编译类型时可见。

因此您可以执行以下操作。

using (var streamWriter = new StreamWriter(stream, Encoding.UTF8, 1024, true))
{
    // TODO: do something 
}

【讨论】:

    【解决方案2】:

    试试这样的:

    public static void WriteSymbol(Stream stream, Symbol symbol)
    {
        using (var streamWriter = new StreamWriter(stream))
        {
            JsonSerializer.Create(SerializerSettings).Serialize(streamWriter, symbol); 
            // test stream here               
        }
    }
    

    或者不要用 using 语句包围这个调用,然后在这个方法之外关闭流。

    【讨论】:

    • 这里不使用using 的问题是许多流装饰器/等缓冲的东西——如果你不完全把它们放下,它们可能不会刷新(即使Flush() 不会总是完全冲洗)
    • 我并不是建议他不要关闭流,只是他在测试了他想要测试的任何内容之后才这样做。
    • 我认为只在using语句中使用StreamWriter是违背作者的想法的。
    • “或者不要用 using 语句包围这个调用并关闭这个方法之外的流。” - 你必须也关闭作家,在正确的时间(这将是:现在)
    • StreamWriter 的优点。他也可以在方法之外创建和管理它。显然这不是最优的,但关键是流正在关闭,他说他想保持它打开足够长的时间来测试一些东西。
    猜你喜欢
    • 2021-11-23
    • 2018-06-14
    • 1970-01-01
    • 2015-07-07
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多