我在我的应用程序中使用Apache Thrift在几台机器之间交换数据。
我从outspace中读取数据,创建传输,协议并将重复数据反序列化为对象。 这是我的代码:
using (var memoryStream = new MemoryStream(data))
{
using (var transport = new TStreamTransport(memoryStream, memoryStream))
{
transport.Open();
using (var protocolo = new TBinaryProtocol(transport))
{
var result = new TCciUserLoginV1.cciUserLoginV1_result();
while (result.Success== null)
{
try
{
result.Read(protocolo);
}
catch { }
}
if (result.Success != null)
{
res = new RequestResult(result.Success);
}
else
{
res = new RequestResult(ResultCodes.LOCAL_ERROR");
}
}
}
}
我知道,我重读了二进制序列化 TCciUserLoginV1.cciUserLoginV1_result ,因为其他类型的反序列化会引发异常。但 result.Success 属性的正常反序列化仅在while循环的第10次迭代后发生。是什么原因我在时使用了。 谁能告诉我发生了什么事?
提前致谢。
答案 0 :(得分:1)
看起来输入数据缓冲区包含一些垃圾,请参见图片。您的数据显示在顶部,使用下面相同的设置显示正确的示例消息。
数据的第一个字节应该是一个类型代码字节,后跟一个16位的字段ID,但在你的样本中,这两个数字都是完全疯狂的:48不是有效的类型代码,-32248似乎不像适当的字段ID。
如果仔细观察图片并使用相同的IDL定义与正确的样本进行比较,则很明显消息不是从头开始,而是在偏移0x59的中间某处开始。因此,发送到Thrift进行反序列化的数据不是有效的数据块,这是肯定的。
另一个严重错误的指标可能是两个数据样本之间的大小差异:2093字节与93字节。
但该服务的开发人员确保我的所有代码都是正确的,并且在将其转换为Java之后,一切都可以正常工作而无需循环。
这可能表明问题出在您收到的内容和Decrypt()
例程之间的问题之间。疯狂的猜测,但这将是下一个要检查的事情。我将比较另一方面加密的内容和结果。或者,将数据BLOB与工作Java测试代码在解密后看到的内容进行比较。某处肯定存在差异。