2011-02-09 37 views
5

Tôi đang gặp sự cố khi cố gắng gửi một mảng int đến một dịch vụ web .NET, dự kiến ​​một mảng trong một trong các đối số. Đó là ít nhất những gì tôi hiểu từ mô tả API trên dịch vụ web mà nói điều này:Sắp xếp lại một mảng các int để gửi bằng cách sử dụng KSOAP2

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

Vì vậy, khi tôi gửi một int duy nhất như dưới đây tôi không nhận được bất kỳ lỗi nào và tôi nghĩ rằng nó hoạt động tốt.

request.addProperty("dataIndexIDs", 63); 

Nhưng khi tôi cố gắng để gửi một mảng ints:

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

hoặc một ArrayList của Số nguyên:

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

tôi bị ném một "java.lang.RuntimeException: Không thể serialize "ngoại lệ. Bất kỳ giúp đỡ xin vui lòng? Tôi đang làm gì sai? Cảm ơn!

+0

Tôi đã có một cảm giác rằng trên thực tế, ngay cả nỗ lực int đơn của tôi không hoạt động đúng, mặc dù không ném ngoại lệ vì không chỉ là datasource = 63 đang được trả về. – TomaszRykala

+0

Nó chắc chắn là một mảng của ints mà nó muốn nhưng có vẻ như KSOAP2 có vấn đề serializing nó. Tôi mặc dù ints và mảng được serializable theo mặc định. hãy giúp – TomaszRykala

+0

Thành thật mà nói, không ai có thể giúp đỡ bạn? :( – TomaszRykala

Trả lời

2

Đây là vấn đề đã biết với thư viện KSOAP2 cho Android, hiện tại không hỗ trợ mảng. Mô tả vấn đề là ở đây:

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

A-bên thứ ba vá, giải pháp và một ví dụ có thể được tìm thấy ở đây:

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

Cá nhân tôi đã không kiểm tra bất kỳ trong số họ như họ cũng yêu cầu thay đổi WSDL dịch vụ web nhưng dường như chúng giải quyết vấn đề.

+3

Vấn đề đó từ lâu đã được khắc phục và các bản phát hành gần đây hỗ trợ hành vi đó mặc dù không sử dụng bản vá được liên kết vì không bao giờ được biên dịch bằng cách sử dụng bản dựng ksaop2-android và không bao giờ được người gửi gửi cập nhật –

+0

Cảm ơn bạn đã cập nhật Manfred – TomaszRykala

5

Dưới đây là ví dụ tốt đẹp có thể giúp bạn:

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

Dưới đây là sửa chữa nhanh chóng của tôi về vấn đề này:

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> 
+0

Thú vị. Tôi sẽ thử lần sau. Cảm ơn bạn đã chia sẻ! – TomaszRykala

6

tôi m gửi từ máy khách Android đến máy chủ .NET, điều này đã làm việc cho tôi

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

Tạo

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

nào trông khủng khiếp, nhưng máy chủ ăn nó anyway

1

Cảm ơn Mindaugas. Một biên tập nhẹ vào câu trả lời của bạn làm việc cho tôi:

SoapObject soapObj = new SoapObject(namespace, "ImageId"); 
     for (Integer i : image_id){ 
      soapObj.addProperty("int", i); 
     } 
     request_login.addProperty("ImageId", soapObj); 
1

Chỉ cần vượt qua tên tham số và giá trị như thế này trong vòng lặp:

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

Chỉ cần vượt qua ItemID như tên tham số trong vòng lặp và giá trị trong vòng lặp.

1

Đối với tôi này hoạt động thông qua các yếu tố mảng từng người một trong một vòng lặp

public List<Integer> intsEnvio; 
for(int i: intsEnvio){ 
    request.addProperty("clases", i); 
} 
Các vấn đề liên quan