反序列化时取得进展 JSON
Progress while deserializing JSON
我正在通过流反序列化一个巨大的 JSON (1.4 GB),因为我不想为了解析而提前将整个内容加载到内存中。这工作正常,但需要大约 80 秒,所以我想显示进度。
public JObject DeserializeViaStream(string filename)
{
object obj;
var serializer = new JsonSerializer();
using (var sr = new StreamReader(new FileStream(filename, FileMode.Open)))
{
using (var jsonTextReader = new JsonTextReader(sr))
{
obj = serializer.Deserialize(jsonTextReader);
}
}
return (JObject) obj;
}
我还没有尝试过,但只有一个想法:我可以实现我自己的流 reader,它跟踪正在读取的字节并将其与文件长度进行比较。
是否有内置选项或更简单的方法来执行此操作?
我最终使用了我的想法。幸运的是,已经有一个 ProgressStream available by Mel Green (archive.org). The original URL 不再可用。
请注意:
- 这种方法可能无法永远适用于所有情况和所有库。这是因为
Seek()
操作提供了随机访问,并且有人可以多次读取文件。
- 我无法在此处 post 源代码,因为它是在不明确的许可下发布的。
我正在通过流反序列化一个巨大的 JSON (1.4 GB),因为我不想为了解析而提前将整个内容加载到内存中。这工作正常,但需要大约 80 秒,所以我想显示进度。
public JObject DeserializeViaStream(string filename)
{
object obj;
var serializer = new JsonSerializer();
using (var sr = new StreamReader(new FileStream(filename, FileMode.Open)))
{
using (var jsonTextReader = new JsonTextReader(sr))
{
obj = serializer.Deserialize(jsonTextReader);
}
}
return (JObject) obj;
}
我还没有尝试过,但只有一个想法:我可以实现我自己的流 reader,它跟踪正在读取的字节并将其与文件长度进行比较。
是否有内置选项或更简单的方法来执行此操作?
我最终使用了我的想法。幸运的是,已经有一个 ProgressStream available by Mel Green (archive.org). The original URL 不再可用。
请注意:
- 这种方法可能无法永远适用于所有情况和所有库。这是因为
Seek()
操作提供了随机访问,并且有人可以多次读取文件。 - 我无法在此处 post 源代码,因为它是在不明确的许可下发布的。