如何防止 Newtonsoft JsonSerializer 关闭流?

Posted

技术标签:

【中文标题】如何防止 Newtonsoft JsonSerializer 关闭流?【英文标题】:How to prevent Newtonsoft JsonSerializer to close the stream? 【发布时间】: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 的内容吗?

【问题讨论】:

你确定是关闭它的序列化程序吗? Is there any way to close a StreamWriter without closing its BaseStream?的可能重复 我强烈怀疑 StreamWriter 是在这里关闭它的东西......请参阅@JeffE 链接到的问题 - 很有可能它会让你排序 @MarcGravell StreamWriter 上有构造函数参数。 LeaveOpen. @ditoslav 根据 IL:1024 【参考方案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 的优点。他也可以在方法之外创建和管理它。显然这不是最优的,但关键是流正在关闭,他说他想保持它打开足够长的时间来测试一些东西。

以上是关于如何防止 Newtonsoft JsonSerializer 关闭流?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 进行条件序列化 - NewtonSoft.Json

如何使用 Newtonsoft 反序列化 EPOCH

如何”Newtonsoft.Json.Linq.JValue”的对象强制转换为类型“Newtonsoft.Json.Linq.JArray"?

如何通过NewtonSoft反序列化对象json列表?

如何使 Newtonsoft.Json.Linq.JObject 不可变?

如何使Newtonsoft.Json.Linq.JObject不可变?