Проблема сериализации класса при вызове wsdl веб-сервиса с помощью ksoap2-ANDROID
Всем привет,
Я вызываю веб-сервис с android с помощью ksoap2. Однако у меня возникла проблема с отправкой параметров сложного типа. У меня есть wsdl, который имеет метод " invokeservice" :
<message name="invokeService"> <part name="serviceName" type="xsd:string"/> <part name="documents" type="tns:uriList"/> <part name="literalDocs" type="ns1:stringArray"/> <part name="connID" type="xsd:long"/> <part name="gateParams" type="tns:gateRuntimeParameterArray"/> <part name="userCtx" type="tns:userContext"/> </message> for the property "gateParams" which is of type "gateRuntimeParameterArray" , you have : <xs:complexType name="gateRuntimeParameterArray" final="#all"> <xs:sequence> <xs:element name="item" type="tns:gateRuntimeParameter" minOccurs="0" maxOccurs="unbounded" nillable="true"/> </xs:sequence> </xs:complexType> this "item" of type "gateRuntimeParameter" has : <xs:complexType name="gateRuntimeParameter"> <xs:sequence> <xs:element name="booleanValue" type="xs:boolean" minOccurs="0"/> <xs:element name="corpusValue" type="xs:anyType" nillable="true" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="defaultValueString" type="xs:string" minOccurs="0"/> <xs:element name="doubleValue" type="xs:double" minOccurs="0"/> <xs:element name="intValue" type="xs:int" minOccurs="0"/> <xs:element name="label" type="xs:string" minOccurs="0"/> <xs:element name="optional" type="xs:boolean"/> <xs:element name="PRName" type="xs:string" minOccurs="0"/> <xs:element name="paramName" type="xs:string" minOccurs="0"/> <xs:element name="pipelineName" type="xs:string" minOccurs="0"/> <xs:element name="stringValue" type="xs:string" minOccurs="0"/> <xs:element name="type" type="xs:string" minOccurs="0"/> <xs:element name="urlValue" type="xs:anyURI" minOccurs="0"/> </xs:sequence> </xs:complexType>
Я создал классы gateRuntimeParameter.java и ... gateRuntimeParameterArray.java " которые реализуют kvmserializable.
public class gateRuntimeParameterArray implements KvmSerializable{ public gateRuntimeParameter[] item ;//= new gateRuntimeParameter[1]; //public List<gateRuntimeParameter> item = new ArrayList<gateRuntimeParameter>(); public void setItemArray(int index,gateRuntimeParameter value) { System.out.println("Filling array of gate params at "+index+" with value: "+value.prName); item[index] = value; //item.add(value); System.out.println("Filling is done ! "+item[index].defaultValueString); } @Override public Object getProperty(int arg0) { switch (arg0){ case 0: return item; default: return null; } } @Override public int getPropertyCount() { return 1; } @Override public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { switch(arg0) { case 0: arg2.type = gateRuntimeParameter.class; //arg2.type = uriList.getClass(); arg2.name = "item"; break; default:break; } } @Override public void setProperty(int arg0, Object arg1) { switch(arg0) { case 0: item = (gateRuntimeParameter[])arg1; //item = (List<GateRuntimeParameterArray>)arg1; break; default: break; } } }
public class gateRuntimeParameter implements KvmSerializable { //"prName", "paramName", "pipelineName", "stringValue", "type", "urlValue"}) public String defaultValueString;//defaultValueString=10; for example public String label;//label=Number of search results; for example public Boolean optional;//optional=true; public String prName;//PRName=Yahoo PR; public String paramName;//paramName=limit; public String pipelineName;//pipelineName=Yahoo Search; public String type;//type=int; public Integer intValue;// how many results we want for yahoo PR for example public Boolean booleanValue ; public List<Object> corpusValue; //public Corpus corpusValue; public Double doubleValue; public String stringValue; public String urlValue; @Override public Object getProperty(int arg0) { switch (arg0){ case 0: return booleanValue; case 1: return corpusValue; case 2: return defaultValueString; case 3: return doubleValue; case 4: return intValue; case 5: return label; case 6: return optional; case 7: return prName;//maybe prName case 8: return paramName; case 9: return pipelineName; case 10: return stringValue; case 11: return type; case 12: return urlValue; default: return null; } } @Override public int getPropertyCount() { // TODO Auto-generated method stub return 13; } @Override public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo arg2) { switch(arg0) { case 0: arg2.type = PropertyInfo.BOOLEAN_CLASS; //arg2.type = uriList.getClass(); arg2.name = "booleanValue"; break; case 1: //arg2.type = List.class;//maybe here is the error arg2.type = PropertyInfo.OBJECT_CLASS;//maybe here is the error arg2.name = "corpusValue"; break; case 2: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "defaultValueString"; break; case 3: arg2.type = Double.class; //arg2.type = uriList.getClass(); arg2.name = "doubleValue"; break; case 4: arg2.type = PropertyInfo.INTEGER_CLASS; //arg2.type = uriList.getClass(); arg2.name = "intValue"; break; case 5: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "label"; break; case 6: arg2.type = PropertyInfo.BOOLEAN_CLASS; //arg2.type = uriList.getClass(); arg2.name = "optional"; break; case 7: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "PRName"; break; case 8: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "paramName"; break; case 9: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "pipelineName"; break; case 10: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "stringValue"; break; case 11: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "type"; break; case 12: arg2.type = PropertyInfo.STRING_CLASS; //arg2.type = uriList.getClass(); arg2.name = "urlValue"; break; default:break; } } @Override public void setProperty(int arg0, Object arg1) { switch(arg0) { case 0: booleanValue = (Boolean)arg1; //Integer.parseInt(arg1.toString()); break; case 1: corpusValue = (List<Object>)arg1; break; case 2: defaultValueString = (String)arg1; break; case 3: doubleValue = (Double)arg1; break; case 4: intValue = (Integer)arg1; break; case 5: label = (String)arg1; break; case 6: optional = (Boolean)arg1; break; case 7: prName = (String)arg1; break; case 8: paramName = (String)arg1; break; case 9: pipelineName = (String)arg1; break; case 10: stringValue = (String)arg1; break; case 11: type = (String)arg1; break; case 12: urlValue = (String)arg1; break; default: break; } } }
и я это делаю:
gateRuntimeParameterArray gtParamArr = new gateRuntimeParameterArray(); gateRuntimeParameter gtRTparam = new gateRuntimeParameter();
Затем я заполняю gtRTparam, а затем делаю следующее:
pi = new PropertyInfo(); pi.setName("gateParams"); pi.setValue(gtParamArr.item); pi.setType(gateRuntimeParameterArray.class); sobj.addProperty(pi);
и тогда я добавить также картографические работы сортировочных:
soapEnvelope.addMapping(namespace, gateRuntimeParameter.class.getSimpleName(), gateRuntimeParameter.class); soapEnvelope.addMapping(namespace, gateRuntimeParameterArray.class.getSimpleName(), gateRuntimeParameterArray.class); Marshal floatMarshal = new MarshalFloat(); floatMarshal.register(soapEnvelope);
Однако я продолжаю получать исключение: не могу сериализовать: [Lcom. example.NLPAndroid.gateRuntimeParamer;@44f05d38
Я пытаюсь уже 3 дня, но не могу понять, что я делаю не так? У меня есть следующая трассировка стека:
java.lang.RuntimeException: Cannot serialize: [Lcom.example.NLPAndroid.gateRuntimeParameter;@43e5ed38 at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:629) at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:613) at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582) at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:566) at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:623) at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:547) at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:192) at org.ksoap2.transport.Transport.createRequestData(Transport.java:74) at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:58) at com.example.NLPAndroid.KSoap2Test.invokeServicesTwo(KSoap2Test.java:419) at com.example.NLPAndroid.NLPAndroidTestServices.onCreate(NLPAndroidTestServices.java:27) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) at android.app.ActivityThread.access$2300(ActivityThread.java:125) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:123) at android.app.ActivityThread.main(ActivityThread.java:4627) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:521) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStart.main(Native Method)
Я знаю, что написал много, но, пожалуйста, мне нужна ваша помощь, у меня есть демо-версия через неделю, и если это не сработает, я ничего не смогу показать :(
Большое спасибо.
HimanshuJoshi
Обновлено для исправления предварительных тегов.
jinshadb
Хайи Чадич........., я тоже сталкиваюсь с той же проблемой. Если вы понимаете как решить эту проблему пожалуйста помогите мне тоже
zhitu
я тоже, помогите мне, пожалуйста