public async Task <object> Read(Type type) { int messageSize = await ReadMessageSize(); using IMemoryOwner <byte> messageBuffer = MemoryPool <byte> .Shared.Rent(messageSize); Memory <byte> messageMemory = messageBuffer.Memory.Slice(0, messageSize); int totalBytesRead = 0; while (totalBytesRead < messageSize) { Memory <byte> targetMemory = messageMemory.Slice(totalBytesRead); int bytesRead = await _stream.ReadAsync(targetMemory); if (bytesRead == 0) { throw new EndOfStreamException(); } totalBytesRead += bytesRead; } _messageLogger.Log(_messageSizeBuffer); _messageLogger.Log(messageMemory); return(_serializer.Deserialize(type, messageMemory)); }
public async Task Write(object message) { _serializer.Serialize(_buffer, message); ReadOnlyMemory <byte> messageMemory = _buffer.WrittenMemory; (int messageSize, ReadOnlyMemory <byte> messageSizeMemory) = WriteMessageSize(); _messageLogger.Log(messageSizeMemory); _messageLogger.Log(messageMemory); await _stream.WriteAsync(messageSizeMemory); await _stream.WriteAsync(messageMemory); _buffer.Clear(); }