【问题标题】:Progress while deserializing JSON反序列化 JSON 时的进展
【发布时间】:2016-07-18 20:11:10
【问题描述】:

我正在通过流反序列化一个巨大的 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;
}

我还没有尝试过,但只有一个想法:我可以实现自己的流阅读器,它跟踪正在读取的字节并将其与文件长度进行比较。

是否有内置选项或更简单的方法来执行此操作?

【问题讨论】:

  • 您最终找到解决方案了吗?
  • @user2441511:请参阅下面的答案。 ProgressStream 有效。

标签: json.net progress


【解决方案1】:

我最终使用了我的想法。幸运的是已经有一个ProgressStream available by Mel Green (archive.org)original URL 不再可用。

请注意:

  • 这种方法可能无法永远适用于所有情况和所有库。这是因为Seek() 操作提供了随机访问,并且有人可以多次读取文件。
  • 我无法在此处发布源代码,因为它是在不明确的许可下发布的。

【讨论】:

  • 我使用了相同的解决方案,它工作正常,除了:虽然进度表明所有字节都已被读取,但进程仍然在JsonSerializer.Deserialize 中挂起很长时间 - 我无法弄清楚谁在忙什么……
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 2015-01-11
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多