我正在开发一个 Android 应用程序,它假设调用 Axis2 Web 服务(已经实现并正在运行),以前的开发人员以 Byte[] 是传递 Object 的常见形式。假设需要在 Axis2 中调用 Web 服务,它应该返回 List,Web 服务会将实例转换为 Byte[] 并返回 Byte[],客户端会将其转换回来。
以下是该服务的片段:
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();
但是我收到了流损坏错误,这可能意味着当我将其转换回来时它的内容根本不一样。
所以我的问题是:
- 返回 Byte[] 时,Axis2 引擎如何将值转换为适合 SOAP 返回
- 将这个“字符串化”值转换回 Byte[] 的方法是什么,以防万一我对 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:
我创建了另一个将字符串返回为 byte[] 的服务,在我的 Android 应用程序中,我收到了 byte[] 并将其转换回原始字符串。所以也许这与我使用 Stream 转换我的 Object <=> byte [] 的方式有关。