Android 访问Webservice接口,参数对象不能串行化问题解决(java.lang.RuntimeException: Cannot serialize)
2014-04-12 21:46
567 查看
服务器端Webservice接口参数使用的是自定义结构体,非通用的一些字符串类。
Android 客户端使用ksoap2 jar包,使用方法如下:
运行出现如下错误:
04-12 21:31:12.046: W/System.err(4202): java.lang.RuntimeException: Cannot serialize: com.jh.webservice_visit.SceneUserValidateEvt@41b1ec80
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:664)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:649)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:604)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:658)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:564)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:205)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.transport.Transport.createRequestData(Transport.java:111)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:121)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
04-12 21:31:12.056: W/System.err(4202): at com.jh.webservice_visit.MainActivity.startWebservice(MainActivity.java:72)
04-12 21:31:12.056: W/System.err(4202): at com.jh.webservice_visit.MainActivity.access$0(MainActivity.java:40)
04-12 21:31:12.056: W/System.err(4202): at com.jh.webservice_visit.MainActivity$2.run(MainActivity.java:113)
04-12 21:31:12.056: W/System.err(4202): at java.lang.Thread.run(Thread.java:856)
第一反应将SceneUserValidateEvt结构体implements Serializable,可是运行后还是如上提示错误。
goolge串行化失败的大多数场景与我的不符合,网上比较多的是一些Integer.class 串行失败的场景,不过后来想了想翻了一下ksoap的包
有一个这个接口类org.ksoap2.serialization.KvmSerializable;
尝试了一下将SceneUserValidateEvt结构体implements KvmSerializable,并实现了以下4个接口,运行成功OK。
Android客户端能正常访问到Webservice接口了。
Android 客户端使用ksoap2 jar包,使用方法如下:
//调用的方法 String methodName = "sceneUserValidate"; //创建httpTransportSE传输对象 HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);//service url ht.debug = true; //使用soap1.1协议创建Envelop对象 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //实例化SoapObject对象 SoapObject request = new SoapObject(SERVICE_NS, methodName); /** * 设置参数,参数名不一定需要跟调用的服务器端的参数名相同,只需要对应的顺序相同即可 * */ SceneUserValidateEvt sevt = new SceneUserValidateEvt(); sevt.setCallNumber("13913008213"); sevt.setInaccessInfo(new InaccessInfo("0020001","0020001","12","12","v1.0")); request.addProperty("SceneUserValidateEvt", sevt); //将SoapObject对象设置为SoapSerializationEnvelope对象的传出SOAP消息 envelope.bodyOut = request; envelope.setOutputSoapObject(request); Log.d("haha","start = "); try{ //调用webService ht.call(SERVICE_NS+methodName, envelope); Log.d("haha","dump = "+ht.requestDump); //txt1.setText("看看"+envelope.getResponse()); if(envelope.getResponse() != null){ SoapObject result = (SoapObject) envelope.bodyIn; String name = result.getProperty(0).toString(); Log.d("haha","返回值 = "+name); }else{ Log.d("haha","返回值 =! "); } }catch (Exception e) { e.printStackTrace(); }
运行出现如下错误:
04-12 21:31:12.046: W/System.err(4202): java.lang.RuntimeException: Cannot serialize: com.jh.webservice_visit.SceneUserValidateEvt@41b1ec80
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:664)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:649)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:604)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:658)
04-12 21:31:12.046: W/System.err(4202): at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:564)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:205)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.transport.Transport.createRequestData(Transport.java:111)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:121)
04-12 21:31:12.056: W/System.err(4202): at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:96)
04-12 21:31:12.056: W/System.err(4202): at com.jh.webservice_visit.MainActivity.startWebservice(MainActivity.java:72)
04-12 21:31:12.056: W/System.err(4202): at com.jh.webservice_visit.MainActivity.access$0(MainActivity.java:40)
04-12 21:31:12.056: W/System.err(4202): at com.jh.webservice_visit.MainActivity$2.run(MainActivity.java:113)
04-12 21:31:12.056: W/System.err(4202): at java.lang.Thread.run(Thread.java:856)
第一反应将SceneUserValidateEvt结构体implements Serializable,可是运行后还是如上提示错误。
goolge串行化失败的大多数场景与我的不符合,网上比较多的是一些Integer.class 串行失败的场景,不过后来想了想翻了一下ksoap的包
有一个这个接口类org.ksoap2.serialization.KvmSerializable;
尝试了一下将SceneUserValidateEvt结构体implements KvmSerializable,并实现了以下4个接口,运行成功OK。
public abstract interface org.ksoap2.serialization.KvmSerializable { // Method descriptor #4 (I)Ljava/lang/Object; public abstract java.lang.Object getProperty(int arg0); // Method descriptor #6 ()I public abstract int getPropertyCount(); // Method descriptor #8 (ILjava/lang/Object;)V public abstract void setProperty(int arg0, java.lang.Object arg1); // Method descriptor #10 (ILjava/util/Hashtable;Lorg/ksoap2/serialization/PropertyInfo;)V public abstract void getPropertyInfo(int arg0, java.util.Hashtable arg1, org.ksoap2.serialization.PropertyInfo arg2); }
Android客户端能正常访问到Webservice接口了。
相关文章推荐
- 解决FTP的URL访问不能有中文名称的问题,报java.lang.IllegalArgumentException
- Fragment内部控件操作的E/AndroidRuntime(1778): java.lang.NullPointerException问题解决
- 开发问题及解决 E/AndroidRuntime(15377): Caused by: java.lang.InstantiationException: can't instantiate clas
- 在Android中调用KSOAP2库访问webservice服务出现的服务端传入参数为null的问题解决
- 严重: Dispatcher initialization failed java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 问题解决
- 异常-----springmvc + ajaxfileupload解决ajax不能异步上传图片的问题。java.lang.ClassCastException: org.apache.catalina.connector.RequestFacade cannot be cast to org.springframework.web.multipart.
- 解决java.lang.RuntimeException: Unable to start activity Activity无法打开的问题
- 访问jsp报错org.apache.jasper.JasperException: java.lang.NullPointerException的解决办法 问题描述:
- setLayoutParams 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
- Android 问题异常 java.lang.RuntimeException: Unable to instantiate activity ComponentInfo
- Android 用webService产生java.lang.ClassCastException: org.ksoap2.serialization.SoapPrimitive错误的解决 .
- 举例说明关于android编程中遇到的java.lang.ClassCastException: android.app.Application问题的原因及解决办法
- java.lang.RuntimeException: Canvas: trying to use a recycled bitmap android.graphics.Bitmap:报错解决
- Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
- ambari-server启动出现Caused by: java.lang.RuntimeException:java.lang.ClassNotFoundEception:com.mysql.jdbc.Driver问题解决办法(图文详解)
- 艰辛的aptana插件安装之路(续)--成功解决myeclipse不能启动和报java.lang.NullPointerException的问题
- Android问题:Test run failed: Instrumentation run failed due to 'java.lang.RuntimeException'
- 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
- 开发问题及解决 java.lang.ClassCastException:android.widget.LinearLayout$LayoutParams
- Android遇到java.lang.RuntimeException: Binary XML file line #20这样的问题怎么办