public bool Store <T>(StoreMode mode, string key, T message, TimeSpan expiration, Action <Status> callback = null, CallBackPolicy callbackPolicy = CallBackPolicy.AllOK)
        {
            Opcode op;

            if (mode == StoreMode.Add)
            {
                op = Opcode.Add;
            }
            else if (mode == StoreMode.Replace)
            {
                op = Opcode.Replace;
            }
            else if (mode == StoreMode.Set)
            {
                op = Opcode.Set;
            }
            else
            {
                throw new ArgumentException("Unsupported operation " + mode);
            }

            var keyAsBytes = _configuration.KeySerializer.SerializeToBytes(key);
            var serializer = _configuration.SerializerOf <T>();
            var request    = new SetRequest
            {
                Key            = keyAsBytes,
                Message        = serializer.ToBytes(message),
                Flags          = serializer.TypeFlag,
                Expire         = expiration,
                RequestId      = NextRequestId,
                CallBack       = SanitizeCallback(callback),
                CallBackPolicy = callbackPolicy,
                Replicas       = _configuration.Replicas,
                RequestOpcode  = op,
            };

            return(SendRequest(request));
        }