Exemple #1
0
        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();
        }