如何在 C# 中动态反序列化 JSON 文本

How to deserialize JSON text on the fly in C#

我是来自异步函数的 reading/receiving 个字节块,我在 MemoryStream 中进行缓冲,然后反序列化为 C# 对象。

    public async Task<Message> Read()
    {
        byte[] block = new byte[1024];
        int bytesRead;

        using var ms = new MemoryStream();
        while ((bytesRead = await GetBlock(block)) > 0)
        {
            ms.Write(block, 0, bytesRead);
        }
        ms.Seek(0, SeekOrigin.Begin);
        var result = await System.Text.Json.JsonSerializer.DeserializeAsync<Message>(ms);
        return result;
    }

我更喜欢一种不会缓冲整个数据并在内存中保留潜在大字节数组的方法。就像一个虚拟流,它在 GetBlocks 函数接收到每个字节块时将其转发到 Desirailize 函数。

    public async Task<Message> Read()
    {
        byte[] block = new byte[1024];
        int bytesRead;

        using var rs = new RedirectStream((rs) =>
        {
            while ((bytesRead = await GetBlock(block)) > 0)
            {
                rs.Write(block, 0, bytesRead);
            }
        });

        var result = await System.Text.Json.JsonSerializer.DeserializeAsync<Message>(rs);
        return result;
    }

这样的流 class 是否存在,或者我是否需要创建自己的流(如果是 - 我应该从哪里开始?)。

除此之外,了解 DeserializeAsync 函数是否能够很好地利用这种机制(意味着在实际开始反序列化之前不将流读到最后)会很有趣。

Does such a stream class exist

据我所知,标准库中没有与您的RedirectStream类似的东西,因此您可能必须自己实现它,like other folks already did. A search for a NuGet package doesn't give pertinent results (like https://github.com/MarcusChr/BlockBasedMemoryStream其中removeReadData放错了位置,可以在你的情况下使用)。

[Does] DeserializeAsync function would even be able to make good use of such a mechanism

JsonSerializer.DeserializeAsync 的实际 版本使用 Stream.ReadAsync 方法,正如您在 the sources 中看到的那样。所以是的,目前(不太可能出现倒退)。