protected override async Task <Tuple <Expression, object> > ServerReceiveQueryAsync()
        {
            do
            {
                var message = await ReceiveMessageAsync().ConfigureAwait(false);

                object argument;

                if (message.Kind == QbservableProtocolMessageKind.Argument)
                {
                    argument = Deserialize <object>(message.Data);

                    message = await ReceiveMessageAsync().ConfigureAwait(false);
                }
                else
                {
                    argument = null;
                }

                if (message.Kind == QbservableProtocolMessageKind.Subscribe)
                {
                    var converter = new SerializableExpressionConverter();

                    return(Tuple.Create(converter.Convert(Deserialize <SerializableExpression>(message.Data)), argument));
                }
                else if (ServerHandleClientShutDown(message))
                {
                    throw new OperationCanceledException();
                }
                else if (!message.Handled)
                {
                    throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Errors.ProtocolExpectedMessageSubscribeFormat, message.Kind));
                }
            }while (true);
        }
        protected override async Task ClientSendQueryAsync(Expression expression, object argument)
        {
            if (argument != null)
            {
                await SendMessageAsync(QbservableProtocolMessageKind.Argument, argument).ConfigureAwait(false);
            }

            var converter = new SerializableExpressionConverter();

            await SendMessageAsync(QbservableProtocolMessageKind.Subscribe, converter.Convert(expression)).ConfigureAwait(false);
        }