首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.Text.Json:从System.IO.Pipelines反序列化

System.Text.Json:从System.IO.Pipelines反序列化
EN

Stack Overflow用户
提问于 2019-10-24 16:51:35
回答 1查看 1.2K关注 0票数 2

我正在使用TcpClient中的Json,为了获得一个低分配和高性能的解决方案,我决定使用新的System.IO.Pipelines来处理IO,使用System.Text.Json来进行反序列化。管道的输出是一个ReadOnlySequence<byte>。当ReadOnlySequence中只有一个段时,我没有问题,这样我就可以将这个段(这是一个ReadOnlySpan<byte>)传递给反序列化程序。但是我应该如何处理多个段呢?

到目前为止,我得到的是下面的代码。但在某些情况下,序列的长度太长,所以我在stackalloc中得到了堆栈溢出。此外,在我看来,复制数据似乎违背了System.IO.Pipelines的意图。System.Text.Json.JsonSerializer.Deserialize不应该有一个ReadOnlySequence重载吗?对如何解决这个问题有什么建议吗?

代码语言:javascript
复制
private void ProcessLine(ReadOnlySequence<byte> sequence)
{
    if (sequence.IsSingleSegment)
    {
        _result = JsonSerializer.Deserialize<MyType>(sequence.FirstSpan, _jsonSerializerOptions);
    }
    else
    {
        Span<byte> stackSpan = stackalloc byte[(int)sequence.Length];
        sequence.CopyTo(stackSpan);
        _result = JsonSerializer.Deserialize<MyType>(stackSpan, _jsonSerializerOptions);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-24 16:56:01

使用Utf8JsonReader类型,它包装了一个序列(注意:它还可以包装一个跨度等),并让它处理单/多/etc段问题:

代码语言:javascript
复制
private void ProcessLine(ReadOnlySequence<byte> sequence)
{
    var reader = new Utf8JsonReader(sequence);
    _result = JsonSerializer.Deserialize<MyType>(ref reader);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58537669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档