2

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

到目前为止,我所拥有的是下面的代码。但在某些情况下,序列的长度太大,所以我在stackalloc. 此外,在我看来,制作数据副本违反了 System.IO.Pipelines 的意图。不应该System.Text.Json.JsonSerializer.Deserialize超载ReadOnlySequence吗?关于如何解决这个问题的任何建议?

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);
    }
}
4

1 回答 1

2

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

private void ProcessLine(ReadOnlySequence<byte> sequence)
{
    var reader = new Utf8JsonReader(sequence);
    _result = JsonSerializer.Deserialize<MyType>(ref reader);
}
于 2019-10-24T08:56:00.807 回答