问题
I'm having a problem trying to send an array of ints to a .NET web service which expects an array in one of the arguments. That's at least what I understand from the API description on the web service which says this:
<dataIndexIDs>
<int>int</int>
<int>int</int> </dataIndexIDs>
So when I send a single int like below I do not get any errors and I think it works fine.
request.addProperty("dataIndexIDs", 63);
But when I try to send an array of ints:
request.addProperty("dataIndexIDs", new int[] {63, 62}); // array of ints
or a ArrayList of Integers:
ArrayList<Integer> indexes = new ArrayList<Integer>();
indexes.add(63);
indexes.add(62);
request.addProperty("dataIndexIDs", indexes); // ArrayList of Integers
I get thrown a "java.lang.RuntimeException: Cannot serialize" exception. Any help please? What am I doing wrong? Thanks!
回答1:
I'm sending from an Android client to a .NET server, this worked for me
SoapObject myArrayParameter = new SoapObject(NAMESPACE, MY_ARRAY_PARAM_NAME);
for( int i : myArray ) {
PropertyInfo p = new PropertyInfo();
p.setNamespace("http://schemas.microsoft.com/2003/10/Serialization/Arrays");
// use whatever type the server is expecting here (eg. "int")
p.setName("short");
p.setValue(i);
myArrayParameter.addProperty(p);
}
request.addSoapObject(myArrayParameter);
Produces
<classificationIds>
<n4:short i:type="d:long" xmlns:n4="http://schemas.microsoft.com/2003/10/Serialization/Arrays">18</n4:short>
</classificationIds>
Which looks terrible, but the server eats it anyway
回答2:
Here is nice example that might help you:
http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks
Here is my quick fix to this issue:
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
soapEnvelope.setOutputSoapObject(Request);
soapEnvelope.dotNet = true;
List<Integer> companies = new ArrayList<Integer>();
companies.add(65);
companies.add(66);
companies.add(67);
Request.addProperty("name", "test1");
SoapObject soapCompanies = new SoapObject(NAMESPACE, "companies");
for (Integer i : companies){
soapCompanies.addProperty("int", i);
}
Request.addSoapObject(soapCompanies);
Output XML:
<n0:companies xmlns:n0 = "http://tempuri.org/">
<int i:type = "d:int">65</int>
<int i:type = "d:int">66</int>
<int i:type = "d:int">67</int>
</n0:companies>
<name i:type = "d:string">test1</name>
回答3:
It is a known issue with the KSOAP2 for Android library, which at the moment simply does not support arrays. The issue description is here:
http://code.google.com/p/ksoap2-android/issues/detail?id=19
A third-party patch, solution and an example can be found here:
http://people.unica.it/bart/ksoap2-patch/
I personally haven't tested any of them as they require also changing the web service WSDL but apparently they address the issue.
回答4:
Thanks Mindaugas. A slight edit to your answer worked for me:
SoapObject soapObj = new SoapObject(namespace, "ImageId");
for (Integer i : image_id){
soapObj.addProperty("int", i);
}
request_login.addProperty("ImageId", soapObj);
回答5:
Just pass parameter name and value like this in loop :
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.setOutputSoapObject(request);
HttpTransportSE ht = new HttpTransportSE(URL);
for (int i=0; i<itemId.length; i++){
request.addProperty("itemId",itemId[i]);
}
ht.call(SOAP_ACTION, envelope);
Just pass itemId as parameter name in loop and value in loop.
回答6:
For me this works passing the Array elements one by one in a loop
public List<Integer> intsEnvio;
for(int i: intsEnvio){
request.addProperty("clases", i);
}
回答7:
For me this works
SoapObject soapCompanies = new SoapObject(NAMESPACE, "listcardIDs");
for (int i=0;i<passed.getListCardIds().size()-1;i++) {
soapCompanies.addProperty("int", passed.getListCardIds().get(i));
}
soapObject.addSoapObject(soapCompanies);
//soapObject.addPropertyIfValue("listCardIDs", soapCompanies);
soapObject.addProperty("userID", passed.getuserId());
soapObject.addProperty("gender", passed.isgender());
来源:https://stackoverflow.com/questions/4951333/serialize-an-array-of-ints-to-send-using-ksoap2