private static object Deserialize(MemoryStream ms, bool fromPool, Type type, DeserializeStringSpanDelegate deserializer) { var bytes = ms.GetBufferAsBytes(); var utf8 = CharPool.GetBuffer(Encoding.UTF8.GetCharCount(bytes, 0, (int) ms.Length)); try { var charsWritten = Encoding.UTF8.GetChars(bytes, 0, (int) ms.Length, utf8, 0); var ret = deserializer(type, new ReadOnlySpan<char>(utf8, 0, charsWritten)); return ret; } finally { CharPool.ReleaseBufferToPool(ref utf8); if (fromPool) ms.Dispose(); } }
public void Can_ToUtf8_and_FromUtf8_in_place_using_Span() { foreach (var test in Utf8Case.Source) { var chars = test.expectedString.AsSpan(); Memory <byte> buffer = BufferPool.GetBuffer(MemoryProvider.Instance.GetUtf8ByteCount(chars)); var bytesWritten = MemoryProvider.Instance.ToUtf8(chars, buffer.Span); var bytes = buffer.Slice(0, bytesWritten); Assert.That(bytes.Length, Is.EqualTo(test.count)); Assert.That(bytes.ToArray(), Is.EquivalentTo(test.expectedBytes)); Memory <char> charBuff = CharPool.GetBuffer(MemoryProvider.Instance.GetUtf8CharCount(bytes.Span)); var charsWritten = MemoryProvider.Instance.FromUtf8(bytes.Span, charBuff.Span); chars = charBuff.Slice(0, charsWritten).Span; Assert.That(chars.Length, Is.EqualTo(test.expectedString.Length)); Assert.That(chars.ToString(), Is.EqualTo(test.expectedString)); } }
private static object Deserialize(MemoryStream memoryStream, bool fromPool, Type type, DeserializeStringSpanDelegate deserializer) { var bytes = memoryStream.GetBufferAsSpan().WithoutBom(); var chars = CharPool.GetBuffer(Encoding.UTF8.GetCharCount(bytes)); try { var charsWritten = Encoding.UTF8.GetChars(bytes, chars); ReadOnlySpan <char> charsSpan = chars; var ret = deserializer(type, charsSpan.Slice(0, charsWritten)); return(ret); } finally { CharPool.ReleaseBufferToPool(ref chars); if (fromPool) { memoryStream.Dispose(); } } }