【发布时间】:2019-08-15 06:59:20
【问题描述】:
我正在使用 NETCore 3.0 的 System.Text.Json 命名空间中的新 JsonSerializer 来反序列化 Json 文档,如下所示:
var result = JsonSerializer.Deserialize<Response>(json, options);
响应定义为:
public class Response
{
public string Foo { get; set; }
public JsonElement Bar { get; set; }
}
JsonDocument 实现 IDisposable 的事实让我想知道,如果保留对可包含在 JsonDocument 中的元素 (Bar) 的引用,是否会造成内存泄漏?
请注意,一般情况下,我会避免将数据存储为像这样的“变体”类型。不幸的是,Bar 属性值的结构在编译时是未知的。
我的怀疑源于 System.Text.Json 宣传的懒惰评估的优势,我不确定这是否涉及延迟 I/O。
【问题讨论】:
-
我认为 IDisposable 是指进行反序列化的对象。不是结果。
-
@JohnB 好吧,请记住,System.Text.Json 的广告优势之一是惰性评估。我不确定这是否涉及延迟 I/O。
-
你这里没有使用JsonDocument,只有JsonElement,它只是一个结构体,没有实现IDisposable。我认为这两件事是独立的
-
@ADyson 我知道,但是如果反序列化器实际上使用 JsonDocument 而不是直接使用 Utf8JsonReader,该元素可以很好地保持对用于反序列化的实际文档的反向引用。跨度>
-
没有泄漏。
JsonSerializer有一个内置转换器JsonConverter<JsonElement>,它调用JsonElement.Clone()。此方法将JsonElement从其主机JsonDocument中复制出来,作为一个独立的对象,允许处理文档。
标签: c# json idisposable .net-core-3.0 system.text.json