Android平臺下使用Ksoap2調用傳遞複雜對象

Android平臺下使用Ksoap2調用傳遞複雜對象 

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

相關文章
相關標籤/搜索