C# JSON.NET JObject.Load()已断开JSON连接

C# JSON.NET JObject.Load()已断开JSON连接,c#,json,linq,json.net,C#,Json,Linq,Json.net,在库中,我有一个接受JObject作为参数的方法。 我想保留这个JObject实例以供以后使用,但我不知道它的生命周期 如果它是由JObject.Parse(File.ReadAllText(jsonFile))创建的那么我就没事了,整个JSON都在内存中并且在JObject被销毁之前不会被处理 但是如果它是使用JObject.Load()从JsonTextReader创建的, 我的问题是如果流关闭会发生什么? 作业对象是否仍然正常工作,还是无效 我对一个检查进行了沙盒处理,即使在文件流被释放后

在库中,我有一个接受JObject作为参数的方法。
我想保留这个JObject实例以供以后使用,但我不知道它的生命周期

如果它是由
JObject.Parse(File.ReadAllText(jsonFile))创建的
那么我就没事了,整个JSON都在内存中并且在
JObject
被销毁之前不会被处理

但是如果它是使用
JObject.Load()
从JsonTextReader创建的,
我的问题是如果流关闭会发生什么?
作业对象是否仍然正常工作,还是无效


我对一个检查进行了沙盒处理,即使在文件流被释放后,它似乎仍能正常工作,但我不确定它对于更大的JSON文件或深度嵌套的JSON文件是否是“防弹”的。

如果它无效,我如何告诉JSON.NET从中创建“内存中”作业对象

以粗体编辑


非常感谢。

您正在同时阅读所有文本

打开一个文本文件,将文件中的所有文本读入字符串,然后 然后关闭文件

一旦使用(方法)解析数据(在您的情况下是内存中分配的字符串),
JObject
将被额外分配
并保留在内存中,由您提供的数据支持(直到它超出范围)

如果您编辑它,或执行其他操作,它不会编辑原始源


就这么简单

不管是从字符串还是从流创建
JObject
JObject
及其保存的数据仍将保留在内存中,直到您让
JObject
超出范围。关闭原始流不会使
JObject
丢失其数据

如果您自己的沙箱测试无法说服您,那么您将找到的最好证据就是检查沙箱本身。如果您查看该类及其基类,您可以看到,虽然它们有从
JsonReader
读取数据的方法,但它们不会在这些方法之外保留对读取器的引用。两个类都没有对
流的任何引用

相反,and类根本没有对
JToken
JObject
的任何引用。如果您查看该类,您会发现它有创建
JTokens
JObjects
的方法,但在这样做时,它使用了一个方法将数据复制到这些对象中。他们之间没有任何永久的联系


尽可能深入地挖掘以说服自己。如果您仍然不相信,请下载源代码,并使用调试器逐步执行。

我对检查进行了沙盒处理,即使在处理文件流之后,它似乎仍能正常工作,但我不确定它是否“防弹”,比如说更大的JSON文件,不管JObject是从字符串还是从流创建的;JObject仍将保留在内存中,直到您让它超出范围。关闭原始流不会使JObject丢失其数据。@BrianRogers您对此有任何参考吗?因为它看起来像,但我不知道我是否能肯定。最好的参考是看源代码本身。查看我的答案。反序列化后,结果的
JObject
和数据源之间没有任何连接
JObject.Load
创建一个填充了数据的
JObject
实例,此实例的生存期取决于GC及其使用方式。谢谢,尽管我的问题是关于使用
JObject.Load(StreamReader)
,但如果在StreamReader离开作用域后仍然存在,但JObject仍然存在。(我的问题是我无法控制JObject是如何创建的,我只是得到一个引用,并担心是否应该在方法完成后保留它。@TomerW一旦调用load,流已被尽可能地读取,JObject不保留对读取器的引用,它只是在load中读取,如果它超出范围并得到垃圾回收ed没有什么不好的事情会发生。谢谢,我没有考虑查看实际的代码,这很有帮助。