2014-10-21 3 views
0

내 응용 프로그램에서 Apache Thrift를 사용하여 여러 대의 컴퓨터간에 데이터를 교환합니다..Net의 Apache Thrift 비 직렬화의 이상한 동작

나는 outspace에서 데이터를 recive, 전송, 프로토콜을 생성하고 recived 데이터 deserialize 개체로. 다른 유형의 직렬화 복원이 예외가 발생하기 때문에 내가 TCciUserLoginV1.cciUserLoginV1_result직렬화 된 바이너리 받아 봐 것으로,

using (var memoryStream = new MemoryStream(data)) 
     { 
      using (var transport = new TStreamTransport(memoryStream, memoryStream)) 
      { 
       transport.Open(); 
       using (var protocolo = new TBinaryProtocol(transport)) 
       { 
        var result = new TCciUserLoginV1.cciUserLoginV1_result(); 

        while (result.Success== null) 
        { 
         try 
         { 
          result.Read(protocolo); 
         } 
         catch { } 
        } 

        if (result.Success != null) 
        { 
         res = new RequestResult(result.Success); 
        } 
        else 
        { 
         res = new RequestResult(ResultCodes.LOCAL_ERROR"); 
        } 
       } 
      } 
     } 

내가 아는 : 다음은 내 코드입니다. 그러나 정상적인 비 직렬화 결과 .Success 속성은 사이클 중 10 번째 반복 이후에만 발생합니다. 왜 내가 을 사용하고을 사용 했는가? 아무도 나에게 무슨 일이 일어나는지 말해 줄 수 있습니까?

미리 감사드립니다.

+0

이상하게 들립니다. 프로토콜/전송 설정을 두 번 확인 했습니까? 어쩌면 당신은 불균형 방식으로 액자 운송을 사용 했습니까 (또는 사용하지 않았습니까?)? 그 외에는 재현 할 수있는 테스트 케이스를 원하고 있습니다. 가지고 계신 분이 있다면 (위의 내용은 누락되었으므로 일부 내용이 누락 된 것이 아닙니다.) 해당 정보를 저희와 공유하십시오. 여기 또는 SO 또는 메일 링리스트에 있습니다. 버그 일 확률이 높은 경우 JIRA 티켓을 제출하십시오. – JensG

+0

미안하지만 내 응용 프로그램이 내게 접근하기 어려운 서비스에서 정보를 암송하기 때문에 테스트 정보를 제공 할 수는 없지만 서비스 개발자는 모든 코드가 올바른지 확인하고 Java로 변환 한 후 모든 것이 잘 동작합니다 사이클없이. 어쩌면 IDL을 C# 코드 생성자에게 보낸다. – ArhiChief

+0

"아마 C# 코드 생성기에 IDL을 절약하는 데 문제가있을 수 있습니다."- 아니요. 그러나 당신이 [sscce] (http://sscce.org)를 어떻게 든 제공 할 수 없다면 우리는 여기서 멈추게됩니다. 들어오는 데이터 스트림을 파일로 캡쳐하는 것은 어떻습니까? 이렇게하면 우리는 그것을 코드로 직접 먹일 수 있습니다. – JensG

답변

1

들어오는 데이터 버퍼에 약간의 가비지가있는 것처럼 보입니다. 그림을 참조하십시오. 아래에 동일한 설정을 사용하여 정확한 샘플 메시지가 상단에 표시됩니다.

데이터의 첫 번째 바이트는 16 비트 필드 ID 뒤에 오는 유형 코드 바이트 여야하지만 샘플에서는 두 숫자가 완전히 제 정신이 아닙니다. 48은 유효한 유형 코드가 아니며 -32248은 싫어합니다. 적절한 필드 ID.

동일한 IDL 정의를 사용하여 그림을 자세히 살펴보고 올바른 표본과 비교하면 메시지가 시작 부분이 아닌 중간에 0x59 오프셋에서 시작한다는 것이 분명해집니다. 따라서 deserialization을 위해 Thrift로 전송 된 데이터는 유효한 데이터 블록이 아닙니다.

심각하게 잘못되었다는 또 다른 표시는 두 데이터 샘플의 크기 차이가 될 수 있습니다 : 2093 바이트 대 93 바이트.

analysis

하지만 서비스의 개발자들은 내 모든 코드가 정확한지, 자바 모든으로 변환 한 후주기없이 잘 작동한다는 보장합니다.

이는 사용자가받은 내용과 Decrypt() 루틴의 문제가 있음을 나타낼 수 있습니다. 과장된 추측이지만 그 다음으로 확인해야합니다. 나는 상대방의 암호화와 무엇이 나오는지 비교할 것입니다. 또는 데이터 BLOB를 해독 후 작업중인 Java 테스트 코드가 보는 것과 비교하십시오. 어딘가의 차이가 있어야합니다.

+0

감사합니다. 나는 네가 옳다고 생각하고 암호 해독 루틴에 문제가 있다고 생각한다. 직렬화 된 데이터를 보내기 전에 서명하고 서비스를 암호화하십시오. 어쩌면 암호 해독 된 데이터에서 부호를 제거하는 것을 잊었을 것입니다. 그러나! 내가 준 코드에는 동일한 기능을하는 anothe 함수가 있지만 다른 데이터를 recivec하고 everithing이 잘 작동합니다. 그렇지 않으면 서비스 개발자에게 답변 해 드리겠습니다. 다시 한 번 감사드립니다! – ArhiChief