Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中动态反序列化JSON文本#_C#_Json_Stream_.net 5_System.text.json - Fatal编程技术网

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

C# 如何在C中动态反序列化JSON文本#,c#,json,stream,.net-5,system.text.json,C#,Json,Stream,.net 5,System.text.json,我从一个异步函数中读取/接收字节块,将其缓冲在内存流中,然后反序列化为一个C#对象 公共异步任务读取() { 字节[]块=新字节[1024]; int字节读取; 使用var ms=new MemoryStream(); while((bytesRead=await GetBlock(block))>0) { ms.Write(块,0,字节读); } Seek女士(0,SeekOrigin.Begin); var result=await System.Text.Json.JsonSerializ

我从一个异步函数中读取/接收字节块,将其缓冲在内存流中,然后反序列化为一个C#对象

公共异步任务读取()
{
字节[]块=新字节[1024];
int字节读取;
使用var ms=new MemoryStream();
while((bytesRead=await GetBlock(block))>0)
{
ms.Write(块,0,字节读);
}
Seek女士(0,SeekOrigin.Begin);
var result=await System.Text.Json.JsonSerializer.DeserializeAsync(ms);
返回结果;
}
我更喜欢不缓冲整个数据并在内存中保留一个潜在的大字节数组的方法。类似于一个虚拟流,当GetBlocks函数接收到每个字节块时,它将每个字节块转发给DesiraIze函数

    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;
    }
公共异步任务读取()
{
字节[]块=新字节[1024];
int字节读取;
使用var rs=新重定向流((rs)=>
{
while((bytesRead=await GetBlock(block))>0)
{
rs.Write(块,0,字节读);
}
});
var result=await System.Text.Json.JsonSerializer.DeserializeAsync(rs);
返回结果;
}
这样的流类是否存在,或者我是否需要创建自己的流类(如果是,我从哪里开始?)

除此之外,了解反序列化异步函数是否能够很好地利用这种机制(意味着在实际开始反序列化之前不将流读到底)也是很有意思的

这样的流类存在吗

据我所知,标准库中没有类似于您的
重定向流
,因此您可能需要自己实现它。搜索NuGet软件包不会给出相关结果(例如,
removeReadData
放错了位置,无法在您的案例中使用)

[Does]
反序列化异步
函数甚至能够很好地利用这种机制


JsonSerializer.DeserializeAsync的实际版本
。所以,现在是的(不太可能有回归)。

您是否接收到多个单独的对象?或者只有一个大对象?只有一个大对象SlidingStream比RedirectStream好得多:)太糟糕了,这不是标准库的一部分,但我应该能够从链接帖子中获得灵感来创建我自己的。你可以选择名称;)
    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;
    }