public void TestMpackPollResponseWriteRead()
        {
            // Arrange
            var response = Message.Create(null, null, null, PollResponse.Create());
            var stream   = new MemoryStream();

            // Act
            response.Encode(stream, CodecId.Mpack);
            byte[] buf      = Interop.MessageDecodeEncode(CodecId.Mpack, 1, stream.GetBuffer(), stream.Length, buffer, buffer.Length);
            var    returned = Serializable.Decode <Message>(new MemoryStream(buf), CodecId.Mpack);

            // Assert
            Assert.IsTrue(response.Equals(returned));
        }
        public override async Task <Message> ReadAsync(Reader reader,
                                                       SerializerContext context, CancellationToken ct)
        {
            var message = Message.Get();
            var members = await reader.ReadObjectHeaderAsync(ct).ConfigureAwait(false);

            if (members != 9)
            {
                throw new FormatException($"Unexpected number of properties {members}");
            }

            message.Version = await reader.ReadUInt32Async(ct).ConfigureAwait(false);

            if ((message.Version >> 16) != (VersionEx.Assembly.ToUInt() >> 16))
            {
                throw new FormatException($"Bad message version {message.Version}");
            }

            message.Source = await context.Get <Reference>().ReadAsync(
                reader, context, ct).ConfigureAwait(false);

            message.Proxy = await context.Get <Reference>().ReadAsync(
                reader, context, ct).ConfigureAwait(false);

            message.Target = await context.Get <Reference>().ReadAsync(
                reader, context, ct).ConfigureAwait(false);

            message.SequenceId = await reader.ReadUInt32Async(ct).ConfigureAwait(false);

            message.Error = await reader.ReadInt32Async(ct).ConfigureAwait(false);

            message.IsResponse = await reader.ReadBoolAsync(ct).ConfigureAwait(false);

            message.TypeId = await reader.ReadUInt32Async(ct).ConfigureAwait(false);

            if (message.IsResponse)
            {
                /**/ if (message.TypeId == MessageContent.Data)
                {
                    message.Content = await context.Get <DataMessage>().ReadAsync(
                        reader, context, ct).ConfigureAwait(false);
                }
                else if (message.TypeId == MessageContent.Ping)
                {
                    message.Content = await context.Get <PingResponse>().ReadAsync(
                        reader, context, ct).ConfigureAwait(false);
                }
                else if (message.TypeId == MessageContent.Link)
                {
                    message.Content = await context.Get <LinkResponse>().ReadAsync(
                        reader, context, ct).ConfigureAwait(false);
                }
                else if (message.TypeId == MessageContent.GetOpt)
                {
                    message.Content = await context.Get <GetOptResponse>().ReadAsync(
                        reader, context, ct).ConfigureAwait(false);
                }
                else if (message.TypeId == MessageContent.Close)
                {
                    message.Content = await context.Get <CloseResponse>().ReadAsync(
                        reader, context, ct).ConfigureAwait(false);
                }
                else
                {
                    await reader.ReadAsync(ct).ConfigureAwait(false);

                    /**/ if (message.TypeId == MessageContent.Open)
                    {
                        message.Content = OpenResponse.Create();
                    }
                    else if (message.TypeId == MessageContent.SetOpt)
                    {
                        message.Content = SetOptResponse.Create();
                    }
                    else if (message.TypeId == MessageContent.Poll)
                    {
                        message.Content = PollResponse.Create();
                    }
                    else
                    {
                        message.Content = null;
                    }
                }
            }