2012-11-23 3 views
1

이전 개발자가 Byte []가 Object를 전달하는 일반적인 방식 인 Axis2 웹 서비스 (이미 구현되고 실행 중임)를 호출한다고 가정하는 Android 애플리케이션을 개발 중입니다. . List를 반환해야하는 Axis2에서 웹 서비스를 호출 할 필요가 있다고 가정하면 웹 서비스는 인스턴스를 Byte []로 변환하고 Byte []를 반환합니다. 여기서 클라이언트는이를 다시 변환합니다.Axis2 ByteArray 웹 서비스 문자열로 반환

public byte[] getMyPersonList() throws Exception { 
    java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(); 
    java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(baos); 
    oos.writeObject(new List<Person>()); 
    return (baos.toByteArray()); 
} 

클라이언트의 (나의 안드로이드 응용 프로그램하지만 웹 서비스를 만드는 같은 사람에 의해 개발되어 기존의 데스크톱 응용 프로그램)

byte[] buffer = (byte[]) serviceClient.invokeBlocking(methodName, 
      new Object[] {}, new Class[] { byte[].class })[0]; 
java.io.ObjectInputStream ois = new java.io.ObjectInputStream(
      new java.io.ByteArrayInputStream(buffer)); 
return (List<Person>) ois.readObject(); 
: 여기

는 서비스에서 조각입니다

invokeBlocking() 메서드는 자동으로 서비스에서 반환 된 값을 자동으로 byte []로 변환하는 것으로 보이지만 응용 프로그램에서 동일한 작업을 수행하는 데 문제가 있습니다.) (

<return> rO0ABXNyABNqYXZhLnV0aWwuQXJyYXlMaXN0eIHSHZnHYZ0DAAFJAARzaXpleHAAAAAJdwQAAAAKc3IAJ3dvcmtmbG9....................... </return>

그리고 내가 지금까지했던 것은 바로 문자열로 수익을 얻고 getBytes를 사용하는 것입니다

내가 브라우저를 통해 수동으로 서비스를 호출 할 때 반환 값이 모습입니다 :

byte [] soapReturnBytes = resultsRequestSOAP.getPropertyAsString("return").getBytes(); 
ObjectInputStream ois = new ObjectInputStream(bais); 
myPersonList= (List<Person>) ois.readObject(); 

그러나 스트림을 손상 시켰습니다. 즉, 변환 할 때 단순히 동일한 내용이 아닐 수 있습니다.

그래서 제 질문은 :

  1. 바이트는 [], Axis2는 엔진이 값을 변환합니까 무엇 SOAP 리턴으로 맞게 반환 할 때
  2. 이 '도 캐릭터 라인'변환하는 방법은 무엇 웹 서비스에 대해 아무 것도 할 수없는 경우 (웹 서비스 수정 없음)

모든 제안을 크게 환영합니다.

편집 :

java.io.StreamCorruptedException: Wrong format: 0 

모든 :

String result = resultsRequestSOAP.getPropertyAsString("return");   
byte[] soapReturnBytes = Base64.decode(result, Base64.DEFAULT); 
ByteArrayInputStream bais = new ByteArrayInputStream(soapReturnBytes); 
ObjectInputStream ois = new ObjectInputStream(bais); 
orgs = (List<Person>) ois.readObject(); 

나는 여전히 같은 오류가 발생 :

제안으로

, 나는 그러나 여전히 운 결과를 얻기 위해 디코더를 사용하지 않고 있어요 암시? 나는 [] 바이트로 문자열을 반환하는 다른 서비스를 만들어

, 내 안드로이드 응용 프로그램에서 나는 바이트 []를 받고 원래의 문자열로 다시 변환 :

EDIT 2를 좌절. 그래서 아마도 스트림을 사용하여 내 객체를 변환하는 방법과 관련이 있습니다. < => byte [].

+0

반환 된 Axis2 문자열을 복사하여 디코더에 붙여 넣어 어떻게되는지 볼 수 있습니까? 서비스가 적절한 값을 반환하지 않거나 클라이언트가 해당 문자열을 적절히 읽지 않습니다. –

+0

내 질문에 편집 됨 – JofryHS

+0

'System.out.println (resultsRequestSOAP.getPropertyAsString ("return"));을 추가하고 출력을 웹 서비스 응답의 내용과 비교할 수 있습니까? 일치하는 경우 문제는 아마 (비) 직렬화 과정에있을 것입니다. –

답변

1

When returning Byte[], what does Axis2 engine do to convert the values to fit it into the SOAP return

자바 유형 byte[]은 XML 스키마 유형 xsd:base64Binary에 매핑됩니다. 변환을 Base64 인코딩이라고합니다.

What are the methods of converting this 'stringified' value back to Byte[], in case I can't do anything about the web service (no modification on the web service)

Base64 디코더를 사용해야합니다. 사용 가능한 수많은 Java 구현이 있습니다 (예 : 코 몬즈 코덱.

+0

Android 유틸리티에서 Base64 디코더를 사용해 보았습니다.하지만 바이트 []를 InputStream으로 변환하면 스트림이 손상됩니다. 나는 내 질문을 업데이트했다. – JofryHS

관련 문제