如何防止 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 开始,您可以使用 StreamWriter
的 LeaveOpen
构造函数参数。
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.Json.Linq.JValue”的对象强制转换为类型“Newtonsoft.Json.Linq.JArray"?