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); }
public override long Deserialize(IByteBuffer buffer, TarsConvertOptions options) { switch (options.TarsType) { case TarsStructType.Long: return(buffer.ReadLong()); default: return(convert.Deserialize(buffer, options)); } }
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); }
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}"); } }
public override Task <T> Deserialize(IByteBuffer buffer, TarsConvertOptions options) { return(Task.FromResult(convert.Deserialize(buffer, options))); }
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; } } }
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; } } }
public override bool Deserialize(IByteBuffer buffer, TarsConvertOptions options) { var value = convert.Deserialize(buffer, options); return(value != 0); }
public override ValueTask <T> Deserialize(IByteBuffer buffer, TarsConvertOptions options) { return(new ValueTask <T>(convert.Deserialize(buffer, options))); }
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); }