當你想使用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轉換爲字節數組時,須要經過解碼,再反序列化。真不明白參考代碼鏈接那篇文章的做者怎麼沒有說明這點,難道他不用解碼也能夠運行成功,仍是忽略寫了這點的重要性。