首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ksoap2序列化错误"RuntimeException:无法序列化“

ksoap2序列化错误"RuntimeException:无法序列化“
EN

Stack Overflow用户
提问于 2012-09-05 08:30:48
回答 1查看 3.5K关注 0票数 1

我正在尝试调用一个web服务,使用安卓app.All网络的操作是在一个单独的类中完成的,该类扩展了AsyncTask类。

代码语言:javascript
复制
package com.webservicedemo1;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class WebServiceDemoActivity extends Activity

{
/** Called when the activity is first created. */

private static String SOAP_ACTION1 = "http://tempuri.org/FahrenheitToCelsius";
private static String SOAP_ACTION2 = "http://tempuri.org/CelsiusToFahrenheit";
private static String NAMESPACE = "http://tempuri.org/";
private static String METHOD_NAME1 = "FahrenheitToCelsius";
private static String METHOD_NAME2 = "CelsiusToFahrenheit";
private static String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";

Button btnFar, btnCel, btnClear;

EditText txtFar, txtCel;

@Override
public void onCreate(Bundle savedInstanceState)

{

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_web_service_demo);

    btnFar = (Button) findViewById(R.id.button1);

    btnCel = (Button) findViewById(R.id.button2);

    btnClear = (Button) findViewById(R.id.button3);

    txtFar = (EditText) findViewById(R.id.editText1);

    txtCel = (EditText) findViewById(R.id.editText2);

    btnFar.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v)

        {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME1);
            request.addProperty("Fahrenheit", txtFar.getText().toString());
            BackGround bg = new BackGround();
            bg.execute(request);
            //request.getP
        }

    });

    btnCel.setOnClickListener(new View.OnClickListener()

    {

        @Override
        public void onClick(View v) {

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME2);
            request.addProperty("Celsius", txtCel.getText().toString());
            BackGround bg = new BackGround();
            bg.execute(request);

        }

    });

    btnClear.setOnClickListener(new View.OnClickListener()

    {

        @Override
        public void onClick(View v)

        {
            txtCel.setText("");
            txtFar.setText("");

        }

    });

}

private class BackGround extends AsyncTask<SoapObject, Object, SoapObject> {
    SoapObject result = null;

    @Override
    protected SoapObject doInBackground(SoapObject... req) {
        // TODO Auto-generated method stub
        // Initialize soap request + add parameters

        // Declare the version of the SOAP request
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);

        envelope.setOutputSoapObject(req);

        envelope.dotNet = true;

        try {


            PropertyInfo pi = new PropertyInfo();

            req[0].getPropertyInfo(0, pi);
            String type=pi.getName();


            HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
            if(type.equals("Fahrenheit")){
            // this is the actual part that will call the webservice
            androidHttpTransport.call(SOAP_ACTION1, envelope);
            }
            else if(type.equals("Celsius")){
                androidHttpTransport.call(SOAP_ACTION2, envelope);
            }
            // Get the SoapResult from the envelope body.
            result = (SoapObject) envelope.bodyIn;


        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        return result;

    }

    @Override
    protected void onPostExecute(SoapObject res) {
        // TODO Auto-generated method stub
        super.onPostExecute(res);
        if (res != null) {

            // Get the first property and change the label text
            txtFar.setText(res.getProperty(0).toString());

        }

        else {

            Toast.makeText(getApplicationContext(), "No Response",
                    Toast.LENGTH_LONG).show();

        }
    }

}

}

但是我得到了以下错误。

代码语言:javascript
复制
08-27 17:48:42.980: W/System.err(1014): java.lang.RuntimeException: Cannot serialize:      [Lorg.ksoap2.serialization.SoapObject;@412102b0
08-27 17:48:42.980: W/System.err(1014):     at   org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:708)
08-27 17:48:42.980: W/System.err(1014):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:618)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:198)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.transport.Transport.createRequestData(Transport.java:111)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:119)
08-27 17:48:42.990: W/System.err(1014):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:95)
08-27 17:48:42.990: W/System.err(1014):     at com.webservicedemo1.WebServiceDemoActivity$BackGround.doInBackground(WebServiceDemoActivity.java:128)
08-27 17:48:42.990: W/System.err(1014):     at com.webservicedemo1.WebServiceDemoActivity$BackGround.doInBackground(WebServiceDemoActivity.java:1)
08-27 17:48:43.000: W/System.err(1014):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
08-27 17:48:43.000: W/System.err(1014):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
08-27 17:48:43.000: W/System.err(1014):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
08-27 17:48:43.000: W/System.err(1014):     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
08-27 17:48:43.000: W/System.err(1014):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
08-27 17:48:43.000: W/System.err(1014):     at >java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
08-27 17:48:43.000: W/System.err(1014):     at java.lang.Thread.run(Thread.java:856)

找不到为什么会发生这种情况。我的代码出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-05 14:43:16

我想您需要更改代码中的一行

代码语言:javascript
复制
envelope.setOutputSoapObject(req);

代码语言:javascript
复制
envelope.setOutputSoapObject(req[0]);

有关AsyncTask的更多信息,请访问:Developer-site

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12273049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档