KSOAP Need Marshalling Help

Does anyone have a good example of sorting objects using the kSOAP package?

+4
source share
1 answer

Although this example is not compiled and complete, the basic idea is to have a class that tells kSOAP how to turn an XML tag into an object (i.e. readInstance ()) and how to turn an object into an XML tag (i.e. 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); } } 

Later, when you call the SOAP service, you map the type of object (in this case, File objects) to the marshalling class. The SOAP envelope will automatically match the type of object for each argument and, if it is not a built-in type, will invoke the associated marshaller to convert it to / from 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; } } 

In this case, I use Base64 encoding to marshal File objects.

+4
source

Source: https://habr.com/ru/post/1276770/


All Articles