Web Service的Android应用程序:无法序列1.0 [英] Web Service Android Application : Cannot serialize 1.0
问题描述
P.S :我已经看过类似的问题,但一直没能明白该怎么做。他们谈论使用名帅类,我似乎无法理解。结果
我创建一个 Android应用程序为消耗JAX-WS 。我使用的 KSOAP-2 库一样的。结果
我取来自用户的输入的一系列文本字段,并通过这些上WebService的活性。结果
在这里,在onCreate方法我称之为建立肥皂对象之后Web服务:结果
保护无效的onCreate(捆绑savedInstanceState){
super.onCreate(savedInstanceState); //从意图消息
意向意图= getIntent();
捆绑额外= intent.getExtras();
字符串cropName = extras.getString(AndroidWSClient.CROP_NAME);
浮面积= extras.getFloat(AndroidWSClient.AREA);
同样地,我得到化肥的一些名字,并将其添加到一个名为fertilizerList一个ArrayList。我以类似的方式还可以得到三个值。结果,
SoapObject要求=新SoapObject空间(namespace,METHOD_NAME); //参数添加到SOAP对象
// cropName
的PropertyInfo propInfo =新的PropertyInfo();
propInfo.name =cropName;
propInfo.type = PropertyInfo.STRING_CLASS;
request.addProperty(propInfo,cropName);
的System.out.println(与cropName !!!!成功!);
//区
propInfo =新的PropertyInfo();
propInfo.setName(区域);
propInfo.setType(Double.class);
request.addProperty(propInfo,区);
的System.out.println(与区域!!!!成功!);
// fertilizerList
propInfo =新的PropertyInfo();
propInfo.setName(fertilizerList);
propInfo.setType(ArrayList.class);
request.addProperty(propInfo,fertilizerList);
的System.out.println(与fertilizerList !!!!成功!);
// N值
propInfo =新的PropertyInfo();
propInfo.setName(氮);
propInfo.setType(Integer.class);
request.addProperty(propInfo,N);
的System.out.println(用N !!!!成功!);
在这里,我创建SOAP对象和属性吧。结果
我需要多个参数传递给我的web服务,所以我在其中添加这些属性的顺序就是它们会显示作为参数传递给Web服务的顺序,对吧?结果
然后我发出请求到Web服务:结果
//发出请求到Web服务
SoapSerializationEnvelope信封=新SoapSerializationEnvelope(SoapEnvelope.VER11);
的System.out.println(创建信封!);
envelope.setOutputSoapObject(请求);
的System.out.println(达到设定输出对象);
HttpTransportSE androidHttpTransport =新HttpTransportSE(URL);
的System.out.println(达到HttpTransport层);
尝试{
androidHttpTransport.call(SOAP_ACTION,信封);
SoapPrimitive resultsRequestSOAP =(SoapPrimitive)envelope.getResponse();
TextView中的TextView =新的TextView(本);
textView.setTextSize(40);
的System.out.println(resultsRequestSOAP.toString());
textView.setText(resultsRequestSOAP.toString());
//设置文本视图作为活动布局
的setContentView(TextView的);
}赶上(例外五){
e.printStackTrace();
}
下面是从logcat的输出:结果
五月七日至11日:37:32.782:我/的System.out(1698):!!!!成功与cropName!
5月7日至一十一日:37:32.782:我/的System.out(1698):!!!!成功与区!
5月7日至一十一日:37:32.792:我/的System.out(1698):!!!!成功与fertilizerList!
5月7日至一十一日:37:32.792:我/的System.out(1698):!!!!成功用N!
5月7日至一十一日:37:32.872:我/的System.out(1698):创建信封!
5月7日至一十一日:37:32.872:我/的System.out(1698):达到设定的输出对象
5月7日至一十一日:37:32.912:我/的System.out(1698):达到HttpTransport层
5月7日至一十一日:37:33.012:W / System.err的(1698):了java.lang.RuntimeException:无法序列:1.0
5月7日至一十一日:37:33.012:W / System.err的(1698):在org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:629)
5月7日至一十一日:37:33.022:W / System.err的(1698):在org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:613)
5月7日至一十一日:37:33.032:W / System.err的(1698):在org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582)
5月7日至一十一日:37:33.032:W / System.err的(1698):在org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:566)
5月7日至一十一日:37:33.062:W / System.err的(1698):在org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:623)
5月7日至一十一日:37:33.072:W / System.err的(1698):在org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:547)
5月7日至一十一日:37:33.072:W / System.err的(1698):在org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:192)
5月7日至一十一日:37:33.092:W / System.err的(1698):在org.ksoap2.transport.Transport.createRequestData(Transport.java:74)
5月7日至一十一日:37:33.092:W / System.err的(1698):在org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:58)
5月7日至一十一日:37:33.112:W / System.err的(1698):在com.example.androidwsclient.WebServiceActivity.onCreate(WebServiceActivity.java:99)
5月7日至一十一日:37:33.112:W / System.err的(1698):在android.app.Activity.performCreate(Activity.java:5104)
5月7日至一十一日:37:33.132:W / System.err的(1698):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
实现对双元帅
公共类MarshalDouble实现元帅
{@覆盖
公共对象readInstance(XmlPullParser分析器,字符串命名,字符串名称,
预期的PropertyInfo)抛出IOException异常,XmlPullParserException { 返回Double.parseDouble(parser.nextText());
}公共无效寄存器(SoapSerializationEnvelope厘米){
cm.addMapping(cm.xsd,双,Double.class,这一点);}@覆盖
公共无效writeInstance(XmlSerializer的作家,obj对象)抛出IOException
writer.text(obj.toString());
}
}
然后调用在code有注册方法。
新MarshalDouble()寄存器(信封)。
P.S : I have looked at similar questions but haven't been able to understand what to do. They talk about using a marshal class, which I can't seem to understand.
I am creating an Android application to consume a JAX-WS. I am using the ksoap-2 library for the same.
I take the inputs from the user in a series of text fields and pass these onto WebService activity.
Here in the onCreate method I call the web service after setting up the soap object :
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);
Similarly I get the some names of fertilizers and add them to an ArrayList called fertilizerList. i also get three more values in a similar manner.
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 !!!");
Here I create the soap object and properties to it.
I need to pass multiple parameters to my Web Service, so the order in which I add these properties is the order in which they'll appear as parameters to the web service, right ?
I then send out the request to the web service :
// 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();
}
Here is the output from the 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)
Implement a Marshal for the Double
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());
}
}
Then call There register method in your code.
new MarshalDouble().register(envelope);
这篇关于Web Service的Android应用程序:无法序列1.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!