使用kso​​ap2 - ANDROID调用webservice的wsdl时序列化类的问题

使用kso​​ap2  -  ANDROID调用webservice的wsdl时序列化类的问题

问题描述:

大家好,



我使用kso​​ap2从android调用web服务。但是我在发送复杂类型参数时遇到了问题。我有一个wsdl,它有一个方法invokeservice:



Hello everyone,

I am calling a web service from android using ksoap2. However I am having a problem in sending complex type parameters. I have a wsdl which has a method "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和实现kvmserializable的gateRuntimeParameterArray.java。





I created classes gateRuntimeParameter.java and "gateRuntimeParameterArray.java" which implement 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;
}

}
}





我正在做:





and I am doing:

gateRuntimeParameterArray gtParamArr = new gateRuntimeParameterArray();

gateRuntimeParameter gtRTparam = new gateRuntimeParameter();





然后我填写gtRTparam,然后我执行以下操作:



Then I fill the gtRTparam, then I do following:

pi = new PropertyInfo();
pi.setName("gateParams");
pi.setValue(gtParamArr.item);

pi.setType(gateRuntimeParameterArray.class);

sobj.addProperty(pi);





然后我添加映射和编组:



and then I add mapping plus marshalling:

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天以来一直在努力,但无法理解我做错了什么?我有以下堆栈跟踪:





However I keep getting Exception : Cannot serialize: [Lcom.example.NLPAndroid.gateRuntimeParamer;@44f05d38

I have been trying since 3 days, but can't understand what am i doing wrong? I have the following stack trace:

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)






我知道我写了很多但请求我的帮助,我在一周内有一个演示,如果这不起作用,我将无法显示任何内容:(



非常感谢。




I know I wrote a lot but please I need your help, I have a demo in a week and if this doesn't work, I won't be able to show anything :(

Thanks a lot.

2300 (ActivityThread.java:125)
在android.app.ActivityThread
2300(ActivityThread.java:125) at android.app.ActivityThread


H.handleMessage(ActivityThread.java:2033)
在android.os.Handler.dispatchMessage (Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.re flect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit
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)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
MethodAndArgsCaller.run(ZygoteInit.java:868) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) at dalvik.system.NativeStart.main(Native Method)







我知道我写了很多但是我需要你的帮助,我在一周内有一个演示,如果这不起作用,我将不会能够显示任何东西:(



非常感谢。




I know I wrote a lot but please I need your help, I have a demo in a week and if this doesn't work, I won't be able to show anything :(

Thanks a lot.