Пример #1
0
        public override T?Deserialize(IByteBuffer buffer, TarsConvertOptions options)
        {
            var old = options.HasValue;

            options.HasValue = false;
            var value = convert.Deserialize(buffer, options);

            options.HasValue = old;
            return(options.HasValue ? (T?)value : null);
        }
Пример #2
0
        public override long Deserialize(IByteBuffer buffer, TarsConvertOptions options)
        {
            switch (options.TarsType)
            {
            case TarsStructType.Long:
                return(buffer.ReadLong());

            default:
                return(convert.Deserialize(buffer, options));
            }
        }
Пример #3
0
        public override Response Deserialize(IByteBuffer buffer, TarsConvertOptions options)
        {
            var resp = new Response();

            headHandler.ReadHead(buffer, options);
            options.Version = resp.Version = shortConvert.Deserialize(buffer, options);
            switch (options.Version)
            {
            case TarsCodecsVersion.V2:
            case TarsCodecsVersion.V3:
                DeserializeV2OrV3(buffer, options, resp);
                break;

            default:
                DeserializeV1(buffer, options, resp);
                break;
            }
            return(resp);
        }
Пример #4
0
        public override IList <T> Deserialize(IByteBuffer buffer, TarsConvertOptions options)
        {
            switch (options.TarsType)
            {
            case TarsStructType.List:
            {
                int size = buffer.ReadInt();
                var list = new List <T>(size);
                var op   = options.Create();
                for (int i = 0; i < size; ++i)
                {
                    headHandler.ReadHead(buffer, op);
                    var t = convert.Deserialize(buffer, op);
                    list.Add(t);
                }
                return(list);
            }

            default:
                throw new TarsDecodeException($"DictionaryTarsConvert can not deserialize {options}");
            }
        }
Пример #5
0
 public override Task <T> Deserialize(IByteBuffer buffer, TarsConvertOptions options)
 {
     return(Task.FromResult(convert.Deserialize(buffer, options)));
 }
Пример #6
0
        private void DeserializeV2OrV3(IByteBuffer buffer, TarsConvertOptions options, Response resp)
        {
            while (buffer.IsReadable())
            {
                headHandler.ReadHead(buffer, options);
                switch (options.Tag)
                {
                case 2:
                    resp.PacketType = byteConvert.Deserialize(buffer, options);
                    break;

                case 3:
                    resp.MessageType = intConvert.Deserialize(buffer, options);
                    break;

                case 4:
                    resp.RequestId = intConvert.Deserialize(buffer, options);
                    break;

                case 5:
                    resp.ServantName = stringConvert.Deserialize(buffer, options);
                    break;

                case 6:
                    resp.FuncName = stringConvert.Deserialize(buffer, options);
                    var(method, isOneway, outParameters, codec, version, serviceType) = rpcMetadata.FindRpcMethod(resp.ServantName, resp.FuncName);
                    resp.ReturnValueType      = method.ReturnParameter;
                    resp.ReturnParameterTypes = outParameters;
                    resp.ReturnParameters     = new object[outParameters.Length];
                    break;

                case 7 when options.Version == TarsCodecsVersion.V2:
                {
                    var uni = new UniAttributeV2(convertRoot, headHandler);
                    uni.Deserialize(buffer, options);
                    if (uni.Temp.ContainsKey(string.Empty))
                    {
                        var buf = uni.Temp[string.Empty].Values.First();
                        headHandler.ReadHead(buf, options);
                        resp.ReturnValue = convertRoot.Deserialize(buf, resp.ReturnValueType.ParameterType, options);
                    }
                    else if (resp.ReturnValueType.ParameterType == typeof(Task))
                    {
                        resp.ReturnValue = Task.CompletedTask;
                    }
                    for (int i = 0; i < resp.ReturnParameterTypes.Length; i++)
                    {
                        var pt  = resp.ReturnParameterTypes[i];
                        var buf = uni.Temp[pt.Name].Values.First();
                        headHandler.ReadHead(buf, options);
                        resp.ReturnParameters[i] = convertRoot.Deserialize(buf, pt.ParameterType, options);
                    }
                }
                break;

                case 7 when options.Version == TarsCodecsVersion.V3:
                {
                    var uni = new UniAttributeV3(convertRoot, headHandler);
                    uni.Deserialize(buffer, options);
                    if (uni.Temp.ContainsKey(string.Empty))
                    {
                        var buf = uni.Temp[string.Empty];
                        headHandler.ReadHead(buf, options);
                        resp.ReturnValue = convertRoot.Deserialize(buf, resp.ReturnValueType.ParameterType, options);
                    }
                    else if (resp.ReturnValueType.ParameterType == typeof(Task))
                    {
                        resp.ReturnValue = Task.CompletedTask;
                    }
                    for (int i = 0; i < resp.ReturnParameterTypes.Length; i++)
                    {
                        var pt  = resp.ReturnParameterTypes[i];
                        var buf = uni.Temp[pt.Name];
                        headHandler.ReadHead(buf, options);
                        resp.ReturnParameters[i] = convertRoot.Deserialize(buf, pt.ParameterType, options);
                    }
                }
                break;

                case 8:
                    resp.Timeout = intConvert.Deserialize(buffer, options);
                    break;

                case 9:
                    resp.Context = dictConvert.Deserialize(buffer, options);
                    break;

                case 10:
                    resp.Status = dictConvert.Deserialize(buffer, options);
                    break;
                }
            }
        }
Пример #7
0
        private void DeserializeV1(IByteBuffer buffer, TarsConvertOptions options, Response resp)
        {
            while (buffer.IsReadable())
            {
                headHandler.ReadHead(buffer, options);
                switch (options.Tag)
                {
                case 2:
                    resp.PacketType = byteConvert.Deserialize(buffer, options);
                    break;

                case 3:
                    resp.RequestId = intConvert.Deserialize(buffer, options);
                    break;

                case 4:
                    resp.MessageType = intConvert.Deserialize(buffer, options);
                    break;

                case 5:
                    resp.ResultStatusCode = (RpcStatusCode)intConvert.Deserialize(buffer, options);
                    var funcData = clientCallBack.FindRpcMethod(resp.RequestId);
                    if (funcData.HasValue)
                    {
                        var(servantName, funcName) = funcData.Value;
                        resp.ServantName           = servantName;
                        resp.FuncName = funcName;
                        var(method, isOneway, outParameters, codec, version, serviceType) = rpcMetadata.FindRpcMethod(resp.ServantName, resp.FuncName);
                        resp.ReturnValueType      = method.ReturnParameter;
                        resp.ReturnParameterTypes = outParameters;
                        resp.ReturnParameters     = new object[outParameters.Length];
                    }
                    break;

                case 6:
                    var contentBuffer = bufferConvert.Deserialize(buffer, options);
                    if (resp.ResultStatusCode == RpcStatusCode.ServerSuccess)
                    {
                        var op         = options.Create();
                        var len        = resp.ReturnParameterTypes.Length;
                        var returnType = resp.ReturnValueType.ParameterType;
                        do
                        {
                            headHandler.ReadHead(contentBuffer, op);
                            switch (op.Tag)
                            {
                            case 0:
                                resp.ReturnValue = convertRoot.Deserialize(contentBuffer, returnType, op);
                                break;

                            default:
                                var index = op.Tag - 1;
                                resp.ReturnParameters[index] = convertRoot.Deserialize(contentBuffer, resp.ReturnParameterTypes[index].ParameterType, op);
                                break;
                            }
                        }while (contentBuffer.IsReadable() &&
                                op.Tag >= 0 &&
                                op.Tag <= len);

                        if (returnType == typeof(Task))
                        {
                            resp.ReturnValue = convertRoot.Deserialize(contentBuffer, returnType, options);
                        }
                    }
                    break;

                case 7:
                    resp.Status = dictConvert.Deserialize(buffer, options);
                    break;

                case 8:
                    resp.ResultDesc = stringConvert.Deserialize(buffer, options);
                    break;

                case 9:
                    resp.Context = dictConvert.Deserialize(buffer, options);
                    break;
                }
            }
        }
Пример #8
0
        public override bool Deserialize(IByteBuffer buffer, TarsConvertOptions options)
        {
            var value = convert.Deserialize(buffer, options);

            return(value != 0);
        }
Пример #9
0
 public override ValueTask <T> Deserialize(IByteBuffer buffer, TarsConvertOptions options)
 {
     return(new ValueTask <T>(convert.Deserialize(buffer, options)));
 }
Пример #10
0
        public override Request Deserialize(IByteBuffer buffer, TarsConvertOptions options)
        {
            var req = new Request();
            var tag = options.Tag = 1;

            while (tag != 0 && buffer.IsReadable())
            {
                headHandler.ReadHead(buffer, options);
                tag = options.Tag;
                switch (tag)
                {
                case 1:
                    req.Version     = shortConvert.Deserialize(buffer, options);
                    options.Version = req.Version;
                    break;

                case 2:
                    req.PacketType = byteConvert.Deserialize(buffer, options);
                    break;

                case 3:
                    req.MessageType = intConvert.Deserialize(buffer, options);
                    break;

                case 4:
                    req.RequestId = intConvert.Deserialize(buffer, options);
                    break;

                case 5:
                    req.ServantName = stringConvert.Deserialize(buffer, options);
                    break;

                case 6:
                    req.FuncName = stringConvert.Deserialize(buffer, options);
                    var(method, isOneway, outParameters, codec, version, serviceType) = rpcMetadata.FindRpcMethod(req.ServantName, req.FuncName);
                    req.IsOneway             = isOneway;
                    req.Mehtod               = method;
                    req.ReturnParameterTypes = outParameters;
                    req.ServiceType          = serviceType;
                    req.ParameterTypes       = method.GetParameters();
                    break;

                case 7 when options.Version == TarsCodecsVersion.V1:
                {
                    var contentBuffer = bufferConvert.Deserialize(buffer, options);
                    req.Parameters = new object[req.ParameterTypes.Length];
                    while (contentBuffer.IsReadable())
                    {
                        headHandler.ReadHead(contentBuffer, options);
                        var index = options.Tag - 1;
                        var type  = req.ParameterTypes[index];
                        req.Parameters[index] = convertRoot.Deserialize(contentBuffer, type.ParameterType, options);
                    }
                }
                break;

                case 7 when options.Version == TarsCodecsVersion.V2:
                {
                    var uni = new UniAttributeV2(convertRoot, headHandler);
                    uni.Deserialize(buffer, options);
                    req.Parameters = new object[req.ParameterTypes.Length];
                    foreach (var pt in req.ParameterTypes)
                    {
                        var pBuffer = uni.Temp[pt.Name].Values.First();
                        headHandler.ReadHead(pBuffer, options);
                        req.Parameters[pt.Position] = convertRoot.Deserialize(pBuffer, pt.ParameterType, options);
                    }
                }
                break;

                case 7 when options.Version == TarsCodecsVersion.V3:
                {
                    var uni = new UniAttributeV3(convertRoot, headHandler);
                    uni.Deserialize(buffer, options);
                    req.Parameters = new object[req.ParameterTypes.Length];
                    foreach (var pt in req.ParameterTypes)
                    {
                        var pBuffer = uni.Temp[pt.Name];
                        headHandler.ReadHead(pBuffer, options);
                        req.Parameters[pt.Position] = convertRoot.Deserialize(pBuffer, pt.ParameterType, options);
                    }
                }
                break;

                case 8:
                    req.Timeout = intConvert.Deserialize(buffer, options);
                    break;

                case 9:
                    req.Context = dictConvert.Deserialize(buffer, options);
                    break;

                case 10:
                    req.Status = dictConvert.Deserialize(buffer, options);
                    tag        = 0;
                    break;

                default:
                    break;
                }
            }
            return(req);
        }