【发布时间】:2021-07-26 00:57:37
【问题描述】:
我正在从一个异步函数读取/接收字节块,我将其缓冲在 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;
}
我更喜欢一种不会缓冲整个数据并在内存中保留潜在大字节数组的方法。就像一个 Dummy-Stream 一样,它将每个字节块转发到 Desirailize 函数,因为它正在被 GetBlocks 函数接收。
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;
}
这样的流类是否存在,或者我需要创建自己的(如果是的话 - 我从哪里开始?)。
除此之外,了解 DeserializeAsync 函数是否能够充分利用这种机制(意味着在实际开始反序列化之前不将流读取到末尾)会很有趣。
【问题讨论】:
-
您是否收到多个单独的对象?还是只有一个大物体?
-
只有一个大对象
标签: c# json stream .net-5 system.text.json