3

したがって、thriftについての私の理解では、Javaは、バイナリセーフな文字列を持たないサポートされている唯一の言語であるため、thriftバイナリタイプです。私の問題はそれがうまくいかないようだということです。

私の定義ファイルは次のとおりです。

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

私のJavaクライアントは、myMethodを呼び出す前に、正の長さであることが確認されたバイナリデータと印刷可能なバイトからByteBufferを構築します。

myMethodのC++実装のすぐ内側(節約によって生成されたサーバースケルトンから)、入力を出力しようとすると、常にサイズ0の空であることが示されます。

私がここで見逃しているアイデアはありますか?バイナリを文字列に変更すると、安全でないJava変換された文字列を後で処理したくないという事実を除いて、すべてが魅力のように機能します...

4

1 に答える 1

4

JavaのByteBufferの状態は可変であるため、問題が発生している可能性があります。したがって、読み取り位置を変更するため、読み取り操作は実際にはByteBufferを変更します。

Javaでスリフトバイナリを操作する最も簡単な(最も効果的ではない)方法は、バイナリをバイト配列として作成し、呼び出しの直前に情報バッファをラップすることです。

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 に答える