Вопрос

У кого-нибудь есть хороший пример маршалинга сложных объектов с использованием пакета 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, вы сопоставите тип объекта (в данном случае, файловые объекты) классу маршалинга.Оболочка 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 для маршалирования файловых объектов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top