0

我在我的应用程序中使用 Apache Thrift 在多台机器之间交换数据。

我从外太空接收数据,创建传输、协议并将接收到的数据反序列化为对象。这是我的代码:

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 次迭代后发生。为什么我使用while。谁能告诉我发生了什么事?

提前致谢。

4

1 回答 1

1

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

数据的第一个字节应该是类型代码字节,后跟一个 16 位字段 ID,但在您的示例中,这两个数字都是完全疯狂的:48 不是有效的类型代码,-32248 似乎不是正确的字段 ID .

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

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

分析

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

这可能表明问题出在您收到的内容与Decrypt()常规内容之间。疯狂的猜测,但这将是接下来要检查的事情。我会比较另一边加密的内容和出来的内容。或者,将数据 BLOB 与工作 Java 测试代码在解密后看到的内容进行比较。一定有不同的地方。

于 2014-10-22T21:01:04.337 回答