Сериализация массива целых чисел для отправки с использованием KSOAP2 - PullRequest
5 голосов
/ 10 февраля 2011

У меня проблема при попытке отправить массив целых чисел в веб-сервис .NET, который ожидает массив в одном из аргументов. Это, по крайней мере, то, что я понимаю из описания API на веб-сервисе, которое гласит:

<dataIndexIDs>
<int>int</int>
<int>int</int> </dataIndexIDs>

Поэтому, когда я отправляю один int, как показано ниже, я не получаю никаких ошибок, и я думаю, что он работает нормально.

request.addProperty("dataIndexIDs", 63);

Но когда я пытаюсь отправить массив целых:

request.addProperty("dataIndexIDs", new int[] {63, 62}); // array of ints

или ArrayList из целых чисел:

ArrayList<Integer> indexes = new ArrayList<Integer>();
    indexes.add(63);
    indexes.add(62);
    request.addProperty("dataIndexIDs", indexes); // ArrayList of Integers

Я получаю исключение "java.lang.RuntimeException: Cannot serialize". Любая помощь, пожалуйста? Что я делаю неправильно? Спасибо!

Ответы [ 7 ]

6 голосов
/ 12 декабря 2012

Я отправляю с клиента Android на сервер .NET, у меня это сработало

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);

Производит

 <classificationIds>
     <n4:short i:type="d:long" xmlns:n4="http://schemas.microsoft.com/2003/10/Serialization/Arrays">18</n4:short>
 </classificationIds>

Что выглядит ужасно, но сервер все равно его ест

5 голосов
/ 01 марта 2012

Вот хороший пример, который может вам помочь:

http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks

Вот мое быстрое решение этой проблемы:

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);

Выходной 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>
2 голосов
/ 13 марта 2011

Это известная проблема с библиотекой KSOAP2 for Android, которая на данный момент просто не поддерживает массивы. Описание проблемы здесь:

http://code.google.com/p/ksoap2-android/issues/detail?id=19

Сторонний патч, решение и пример можно найти здесь:

http://people.unica.it/bart/ksoap2-patch/

Лично я не тестировал ни одну из них, поскольку они также требуют изменения WSDL веб-службы, но, очевидно, они решают проблему.

1 голос
/ 30 июня 2015

Для меня это работает, передавая элементы Array один за другим в цикле

public List<Integer> intsEnvio;
for(int i: intsEnvio){
    request.addProperty("clases", i);
}
1 голос
/ 05 февраля 2014

Просто передайте имя параметра и значение в цикле следующим образом:

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);

Просто передайте itemId как имя параметра в цикле и значение в цикле.

1 голос
/ 20 марта 2013

Спасибо Миндаугасу. Небольшое редактирование вашего ответа сработало для меня:

SoapObject soapObj = new SoapObject(namespace, "ImageId");
        for (Integer i : image_id){
            soapObj.addProperty("int", i);
        }
        request_login.addProperty("ImageId", soapObj);
0 голосов
/ 27 апреля 2019

Для меня это работает

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());
...