Java Thrift客户端和二进制数据

时间:2012-12-07 20:15:39

标签: java c++ thrift

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

我的定义文件是:

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

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

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

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

1 个答案:

答案 0 :(得分: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);