需要kSOAP编组帮助
时间:2020-03-05 18:57:13 来源:igfitidea点击:
是否有人使用kSOAP包编写了一个很好的复杂对象编组示例?
解决方案
回答
尽管此示例不是可编译且不完整的,但基本思想是拥有一个类,该类告诉kSOAP如何将XML标记转换为对象(即readInstance())以及如何将对象转换为XML标记(即writeInstance()) )。
public class MarshalBase64File implements Marshal { public static Class FILE_CLASS = File.class; public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) throws IOException, XmlPullParserException { return Base64.decode(parser.nextText()); } public void writeInstance(XmlSerializer writer, Object obj) throws IOException { File file = (File)obj; int total = (int)file.length(); FileInputStream in = new FileInputStream(file); byte b[] = new byte[4096]; int pos = 0; int num = b.length; if ((pos + num) > total) { num = total - pos; } int len = in.read(b, 0, num); while ((len != -1) && ((pos + len) < total)) { writer.text(Base64.encode(b, 0, len, null).toString()); pos += len; if ((pos + num) > total) { num = total - pos; } len = in.read(b, 0, num); } if (len != -1) { writer.text(Base64.encode(b, 0, len, null).toString()); } } public void register(SoapSerializationEnvelope cm) { cm.addMapping(cm.xsd, "base64Binary", MarshalBase64File.FILE_CLASS, this); } }
稍后,当我们调用SOAP服务时,会将对象类型(在本例中为File对象)映射到编组类。 SOAP信封将自动匹配每个参数的对象类型,如果它不是内置类型,则调用关联的编组器将其转换为XML。
public class MarshalDemo { public String storeFile(File file) throws IOException, XmlPullParserException { SoapObject soapObj = new SoapObject("http://www.example.com/ws/service/file/1.0", "storeFile"); soapObj.addProperty("file", file); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); new MarshalBase64File().register(envelope); envelope.encodingStyle = SoapEnvelope.ENC; envelope.setOutputSoapObject(soapObj); HttpTransport ht = new HttpTransport(new URL(server, "/soap/file")); ht.call("http://www.example.com/ws/service/file/1.0/storeFile", envelope); String retVal = ""; SoapObject writeResponse = (SoapObject)envelope.bodyIn; Object obj = writeResponse.getProperty("statusString"); if (obj instanceof SoapPrimitive) { SoapPrimitive statusString = (SoapPrimitive)obj; String content = statusString.toString(); retVal = content; } return retVal; } }
在这种情况下,我使用Base64编码来封送File对象。