因此,通过我对thrift的理解,Java是唯一支持没有二进制安全字符串的语言,因此是thrift二进制类型。我的问题是它似乎不起作用。
我的定义文件是:
service myService {
int myMethod(1:binary input)
}
我的Java客户端从二进制数据构建一个ByteBuffer,在调用myMethod之前,它被观察到具有正长度和可打印字节。
立即在myMethod的C ++实现中(来自thrift生成的服务器框架),尝试打印输入显示它始终为空0大小。
我在这里缺少什么想法?将二进制文件更改为字符串会使所有内容都像魅力一样,减去我不希望以后不安全的java转换字符串处理的事实......
答案 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);