当你想使用ksoap2从服务端递复杂对象给android 客户端时,下面的代码能够帮助你。这是我寻找了两天,终于找到的解决方案,期间的辛苦与烦恼就不提了。遗憾网上竟没有一个完整的博客说明这点,有点是提供大体的方案,然而一些没有提到的小细节每每绊住了你前进的脚步,多次失败的尝试不断的打击着你的信心,令你灰心丧气,功亏一篑。 html
下面贴出代码,你们能够参考下,这些代码是我编译经过并能够成功运行的。 android
众所周知,ksoap2 已经默认实现了基本类型(string, int , float,double)数据的类型的序列化传输,就是你不须要手动序列化这些基本类型数据,ksoap已经帮你实现了。然而对于复杂类型对象的传输,咱们必须了解下它的传输原理: 数组
1. 当传输的是arraylist<基本类型> 对象时,你只要把它当作基本类型数据来传就是了,咱们能够在浏览器中查看服务端函数的返回形式,能够看到次种传输的返回结果是<return>值1</return> <return>值2</return> <return>值3</return>。由此能够看到返回数组的结果形式是由多个相同节点名组成的xml,所以咱们只须要在客户端用 浏览器
if (envelope.getResponse() != null) {
SoapObject result = (SoapObject) envelope.bodyIn; 这句和下面一句,这两句代码就能帮你获取list的元素值了。
textView_result.setText(result.getProperty(0).toString()); 0 表示数组的第1个元素值
textView_result.setText(result.toString());
} else { } 函数
2. 当传输的是类对象时,且类对象的属性值都是是基本数据类型,这与上面的原理基本类似,其代码以下: spa
if (envelope.getResponse() != null) {
SoapObject result = new SoapObject(serviceUrl,"NetData");
result = (SoapObject) envelope.getResult(); //这里若是用bodyin是不行的,抛出异常。
String nd = result.getProperty("name").toString(); //执行服务端的类属性值的名称
textView_result.setText(nd.toString());
} else { } code
3. 当传输任意数据类型时,能够将其封装为类,再把它序列化为byte数组进行传输,在另外一端进行反序列化为类对象,这样就能够用该对象访问类里全部成员变量了。其参考代码链接:http://www.cublog.cn/u1/47207/showart_1864609.html。该文章讲得很详细,能够按照它来编写,但有一点须要注意, xml
byte[] by = (byte[])Response; 这行代码,在我运行时抛出异常,我不明白做者是怎么能成功运行的。通过辛苦找寻,终于找到了解决的办法,其可行代码是: htm
Object result =(Object)envelope.getResult();
String retString = String.valueOf(result);
byte[] retByte = org.kobjects.base64.Base64.decode(retString);
DataPacket Dp = DataPacket.deserialize(retByte); 对象
获取的object转换为字节数组时,须要经过解码,再反序列化。真不明白参考代码链接那篇文章的做者怎么没有说明这点,难道他不用解码也能够运行成功,仍是忽略写了这点的重要性。