1

我正在开发一个 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();

但是我收到了流损坏错误,这可能意味着当我将其转换回来时它的内容根本不一样。

所以我的问题是:

  1. 返回 Byte[] 时,Axis2 引擎如何将值转换为适合 SOAP 返回
  2. 将这个“字符串化”值转换回 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 [] 的方式有关。

4

1 回答 1

1

返回 Byte[] 时,Axis2 引擎如何将值转换为适合 SOAP 返回

Java 类型byte[]映射到 XML Schema 类型xsd:base64Binary。这种转换称为 Base64 编码。

将这个“字符串化”值转换回 Byte[] 的方法是什么,以防万一我对 Web 服务无能为力(对 Web 服务没有修改)

您需要使用 Base64 解码器。有许多可用的 Java 实现,例如 Commons Codec。

于 2012-11-26T20:07:26.240 回答