2013-07-11 2 views
0

P.S: Я просмотрел похожие вопросы, но не смог понять, что делать. Они говорят об использовании класса маршала, который я, похоже, не понимаю.
Веб-служба Android Приложение: невозможно сериализовать 1.0

Я создаю приложения Android к потреблять JAX-WS. Я использую библиотеку ksoap-2 для этого же.

Я беру данные от пользователя в виде текстовых полей и передаю их в действие WebService.
Здесь в OnCreate метод я вызова веб-службы после настройки объекта мыло:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // Get the message from the intent 
    Intent intent = getIntent(); 
    Bundle extras = intent.getExtras(); 
    String cropName = extras.getString(AndroidWSClient.CROP_NAME); 
    float area = extras.getFloat(AndroidWSClient.AREA); 

Точно так же я получаю некоторые имена удобрений и добавить их в ArrayList под названием fertilizerList. Я также получаю еще три значения аналогичным образом.

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

    // Add parameters to the SOAP object 
    // cropName 
    PropertyInfo propInfo = new PropertyInfo(); 
    propInfo.name = "cropName"; 
    propInfo.type = PropertyInfo.STRING_CLASS; 
    request.addProperty(propInfo, cropName); 
    System.out.println("!!!! Success with cropName !!!"); 
    // Area 
    propInfo = new PropertyInfo(); 
    propInfo.setName("area"); 
    propInfo.setType(Double.class); 
    request.addProperty(propInfo, area); 
    System.out.println("!!!! Success with area !!!"); 
    // fertilizerList 
    propInfo = new PropertyInfo(); 
    propInfo.setName("fertilizerList"); 
    propInfo.setType(ArrayList.class); 
    request.addProperty(propInfo, fertilizerList); 
    System.out.println("!!!! Success with fertilizerList !!!"); 
    // N value 
    propInfo = new PropertyInfo(); 
    propInfo.setName("nitrogen"); 
    propInfo.setType(Integer.class); 
    request.addProperty(propInfo, n); 
    System.out.println("!!!! Success with N !!!"); 

Здесь я создаю объект мыла и свойства к нему.
Мне нужно передать несколько параметров в мою веб-службу, поэтому порядок, в котором я добавляю эти свойства, - это порядок, в котором они будут отображаться в качестве параметров для веб-службы, верно?
я затем отправить запрос на веб-службы:

// Send out the request to the web service 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    System.out.println("created envelope!"); 
    envelope.setOutputSoapObject(request); 
    System.out.println("Reached set output object"); 
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); 
    System.out.println("Reached HttpTransport layer"); 
    try { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     SoapPrimitive resultsRequestSOAP = (SoapPrimitive) envelope.getResponse(); 
     TextView textView = new TextView(this); 
     textView.setTextSize(40); 
     System.out.println(resultsRequestSOAP.toString()); 
     textView.setText(resultsRequestSOAP.toString()); 
     // Set the text view as the activity layout 
     setContentView(textView); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Вот выход из LogCat:

07-11 05:37:32.782: I/System.out(1698): !!!! Success with cropName !!! 
    07-11 05:37:32.782: I/System.out(1698): !!!! Success with area !!! 
    07-11 05:37:32.792: I/System.out(1698): !!!! Success with fertilizerList !!! 
    07-11 05:37:32.792: I/System.out(1698): !!!! Success with N !!! 
    07-11 05:37:32.872: I/System.out(1698): created envelope! 
    07-11 05:37:32.872: I/System.out(1698): Reached set output object 
    07-11 05:37:32.912: I/System.out(1698): Reached HttpTransport layer 
    07-11 05:37:33.012: W/System.err(1698): java.lang.RuntimeException: Cannot serialize: 1.0 
    07-11 05:37:33.012: W/System.err(1698):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:629) 
    07-11 05:37:33.022: W/System.err(1698):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:613) 
    07-11 05:37:33.032: W/System.err(1698):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582) 
    07-11 05:37:33.032: W/System.err(1698):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:566) 
    07-11 05:37:33.062: W/System.err(1698):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:623) 
    07-11 05:37:33.072: W/System.err(1698):  at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:547) 
    07-11 05:37:33.072: W/System.err(1698):  at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:192) 
    07-11 05:37:33.092: W/System.err(1698):  at org.ksoap2.transport.Transport.createRequestData(Transport.java:74) 
    07-11 05:37:33.092: W/System.err(1698):  at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:58) 
    07-11 05:37:33.112: W/System.err(1698):  at com.example.androidwsclient.WebServiceActivity.onCreate(WebServiceActivity.java:99) 
    07-11 05:37:33.112: W/System.err(1698):  at android.app.Activity.performCreate(Activity.java:5104) 
    07-11 05:37:33.132: W/System.err(1698):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
+0

Я не вижу propInfo.setValue() в любом месте ... вам нужно передать некоторые значения? – Papasmile

+0

@Papasmile Я установил значение в вызове addProperty с аргументом seccond. – user1925405

+0

Этот второй аргумент - это свойство name Eg area. Где ваше значение Eg 100.0? – Papasmile

ответ

3

Реализовать Marshal для двойного

public class MarshalDouble implements Marshal 
{ 

@Override 
public Object readInstance(XmlPullParser parser, String namespace, String name, 
     PropertyInfo expected) throws IOException, XmlPullParserException { 

    return Double.parseDouble(parser.nextText()); 
} 

public void register(SoapSerializationEnvelope cm) { 
    cm.addMapping(cm.xsd, "double", Double.class, this); 

} 

@Override 
public void writeInstance(XmlSerializer writer, Object obj) throws IOException { 
     writer.text(obj.toString()); 
    }   
} 

Затем вызовите в вашем коде метод регистрации.

new MarshalDouble().register(envelope); 
+0

Спасибо. Это работает! – user1925405

+0

Я думаю, что MarshalDouble доступен в новую версию KSoap2. Вы можете напрямую использовать ее без ее реализации (я еще не пробовал ее) – naveejr