2012-11-23 110 views
1

我正在开发一个Android应用程序,它假设调用Axis2 Web Service(已经实现并运行),以前的开发人员以Byte []是传递Object的常用形式。假设需要在Axis2中调用应该返回List的Web服务,Web服务会将该实例转换为Byte []并返回Byte [],客户端会将其转换回来。Axis2 ByteArray Web服务返回字符串

这里是从服务的片段:

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()); 
} 

在客户端(不是我的Android应用程序,但是这是由同一人创建Web服务开发已有的桌面应用程序)

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. 什么是转换这个“字符串化”的方法值返回字节[],以防万一我无法做任何有关Web服务(无需修改Web服务)

任何建议,非常感谢。

编辑:

至于建议,我使用的解码器得到的结果,但仍然没有运气:

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(); 

我还收到了同样的错误:

java.io.StreamCorruptedException: Wrong format: 0 

任何建议? 感到沮丧

编辑2:

我创建了返回的字符串作为字节[]其他服务,并在我的Android应用程序,我收到的byte [],并将其转换回原始字符串。所以也许它与我使用流转换我的对象< => byte []的方式有关。

+0

您可以复制返回的字符串Axis2服务并将其粘贴到解码器中以查看会发生什么情况?两种服务都不会返回适当的值,或者客户端不会正确读取该字符串。 –

+0

编辑我的问题 – JofryHS

+0

还有一件事不清楚 - 你可以添加'System.out.println(resultsRequestSOAP.getPropertyAsString(“return”));'并将输出与Web服务响应的内容进行比较?如果匹配,那么问题可能在(de)序列化过程中。 –

回答

1

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

Java类型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实现,例如Commons Codec。

+0

我已经尝试从Android实用程序使用Base64解码器,但当我将byte []转换为InputStream时,流仍然损坏。我更新了我的问题。 – JofryHS