System.Text.Json:从 System.IO.Pipelines 反序列化
System.Text.Json: deserializing from System.IO.Pipelines
我正在使用来自 TcpClient 的 Json,为了获得低分配和良好性能的解决方案,我决定使用新的 System.IO.Pipelines
来处理 IO 和 System.Text.Json
来反序列化.管道的输出是 ReadOnlySequence<byte>
。当 ReadOnlySequence
中只有一个段时我没问题,这样我就可以将这个段(这是一个 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);
}
}
使用Utf8JsonReader
类型,包裹一个序列(注意:它也可以包裹一个跨度等),让它处理single/multi/etc段问题:
private void ProcessLine(ReadOnlySequence<byte> sequence)
{
var reader = new Utf8JsonReader(sequence);
_result = JsonSerializer.Deserialize<MyType>(ref reader);
}
我正在使用来自 TcpClient 的 Json,为了获得低分配和良好性能的解决方案,我决定使用新的 System.IO.Pipelines
来处理 IO 和 System.Text.Json
来反序列化.管道的输出是 ReadOnlySequence<byte>
。当 ReadOnlySequence
中只有一个段时我没问题,这样我就可以将这个段(这是一个 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);
}
}
使用Utf8JsonReader
类型,包裹一个序列(注意:它也可以包裹一个跨度等),让它处理single/multi/etc段问题:
private void ProcessLine(ReadOnlySequence<byte> sequence)
{
var reader = new Utf8JsonReader(sequence);
_result = JsonSerializer.Deserialize<MyType>(ref reader);
}