【问题标题】:Java Thrift Client and Binary dataJava Thrift 客户端和二进制数据
【发布时间】:2012-12-07 20:15:38
【问题描述】:

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

我的定义文件是:

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

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

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

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

【问题讨论】:

  • 二进制类型是 Thrift 中某些语言之间已知的互操作性问题。但我没有听说过 Java C++ 有问题。您是否捕获了原始电线数据?

标签: java c++ thrift


【解决方案1】:

您很可能遇到问题,因为 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);

【讨论】:

  • 如果我理解正确,如果我尝试从 Java 中读取,您所引用的问题就会暴露出来。我现在正在做的事情与您的第一个代码 sn-p 匹配,唯一的例外是我使用 put 而不是 wrap,并将其作为方法调用之外的单独行来执行。我以后不执行任何 ByteBuffer 操作。
  • 看起来你解决了这个问题。我最终使用的第三个替代方法是在方法调用之前调用 buffer.position(0)。
猜你喜欢
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2019-07-27
  • 2014-12-01
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多