Apache。Thrift反序列化在.Net中的奇怪行为

时间:2014-10-21 14:48:07

标签: c# thrift thrift-protocol binary-deserialization

我在我的应用程序中使用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次迭代后发生。是什么原因我在时使用了。 谁能告诉我发生了什么事?

提前致谢。

1 个答案:

答案 0 :(得分:1)

看起来输入数据缓冲区包含一些垃圾,请参见图片。您的数据显示在顶部,使用下面相同的设置显示正确的示例消息。

数据的第一个字节应该是一个类型代码字节,后跟一个16位的字段ID,但在你的样本中,这两个数字都是完全疯狂的:48不是有效的类型代码,-32248似乎不像适当的字段ID。

如果仔细观察图片并使用相同的IDL定义与正确的样本进行比较,则很明显消息不是从头开始,而是在偏移0x59的中间某处开始。因此,发送到Thrift进行反序列化的数据不是有效的数据块,这是肯定的。

另一个严重错误的指标可能是两个数据样本之间的大小差异:2093字节与93字节。

analysis

  

但该服务的开发人员确保我的所有代码都是正确的,并且在将其转换为Java之后,一切都可以正常工作而无需循环。

这可能表明问题出在您收到的内容和Decrypt()例程之间的问题之间。疯狂的猜测,但这将是下一个要检查的事情。我将比较另一方面加密的内容和结果。或者,将数据BLOB与工作Java测试代码在解密后看到的内容进行比较。某处肯定存在差异。