3

因此,根据我对 thrift 的理解,Java 是唯一一种没有二进制安全字符串的受支持语言,因此是 thrift 二进制类型。我的问题是它似乎不起作用。

我的定义文件是:

service myService {
     int myMethod(1:binary input)
}

我的 Java 客户端在调用 myMethod 之前从观察到具有正长度和可打印字节的二进制数据构建 ByteBuffer。

在 myMethod 的 C++ 实现中(来自 thrift 生成的服务器骨架),尝试打印输入显示它始终为空大小为 0。

有什么想法我在这里想念的吗?将二进制文件更改为字符串使一切都像魅力一样工作,减去我不希望以后处理不安全的 java 转换字符串的事实......

4

1 回答 1

4

很可能您遇到了问题,因为 Java 中的 ByteBuffer 具有可变状态。因此,任何读取操作实际上都会修改 ByteBuffer,因为它会修改读取位置。

在 java 中使用 thrift 二进制文件的最简单(虽然不是最有效)的方法是将二进制文件创建为字节数组,并在调用之前立即将它们包装在信息缓冲区中,即:

byte[] input = ....;
myService.myMethod(ByteBuffer.wrap(input));

另一种可能的解决方案是使用 ByteBuffer.duplicate 来保持原始缓冲区的安全,即:

ByteBuffer input = ....;
dump(input.duplicate());// dump function may change buffer position
myService.myMethod(input);
于 2012-12-08T09:53:11.453 回答