2012-12-07 3 views
3

저축에 대한 이해로 Java는 바이너리 안전 문자열을 지원하지 않는 유일한 언어이므로 절약형 바이너리 유형입니다. 내 문제는 그것이 작동하지 않는 것입니다.Java Thrift 클라이언트 및 이진 데이터

내 정의 파일은 다음과 같습니다

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

내 자바 클라이언트가 긍정적 인 길이를 가지고 관찰 바이너리 데이터, MyMethod라는를 호출하기 전에 인쇄 바이트에서의 ByteBuffer를 작성합니다. MyMethod라는의 C++ 구현 내부 즉시

은 (중고품 서버 골격을 생성에서) 입력을 인쇄하려고 내가 여기에 무엇을 그것은 항상 0

어떤 아이디어 크기의 비어있는 누락있어 보여? 바이너리를 문자열로 바꾸면 모든 것이 매력적으로 작동합니다. 나중에 안전하지 않은 Java 변환 문자열을 처리하지 않기를 바랍니다.

+0

바이너리 유형은 특정 언어 사이의 Thrift에서 알려진 상호 운용성 문제입니다. 하지만 나는 Java에 대해 들어 보지 못했다. <-> C++에 문제가있다. 원시 와이어 데이터를 캡처 했습니까? –

답변

4

Java의 ByteBuffer가 변경 가능하기 때문에 문제가 발생할 가능성이 큽니다. 상태. 따라서 모든 읽기 작업은 실제로 읽기 위치를 수정하므로 ByteBuffer를 수정합니다.

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

또 다른 가능한 해결책은 다음과 같습니다

바이트 배열로 바이너리를 생성하고 immidiately 호출하기 전에 그들에게 정보 버퍼를 포장 사용하는 자바 중고품 바이너리, 즉 작동하는 simpliest (반면 가장 효과가 없습니다) 방법

ByteBuffer input = ....; 
dump(input.duplicate());// dump function may change buffer position 
myService.myMethod(input); 
+0

올바르게 이해하면 Java에서 읽으려고하면 참조하는 문제가 노출됩니다. 현재 내가하고있는 일은 첫 번째 코드 스 니펫과 랩의 대신에 put을 사용하고 메서드 호출 외부에서 별도의 행으로 사용하는 유일한 예외와 일치합니다. 나중에 ByteBuffer 작업을 수행하지 않습니다. – yodafan86

+1

님이 문제를 해결 한 것처럼 보입니다. 세 번째로, 대안으로 픽스를 사용하기 전에 메서드 호출 전에 buffer.position (0)을 호출하는 것입니다. – yodafan86