2008-09-16 2 views

答えて

4

基本的な考え方は、kSOAPにXMLタグをオブジェクトに変換する方法(readInstance())と、オブジェクトをXMLタグに変換する方法を教えるクラスを持つことですすなわちwriteInstance())。あなたはSOAPサービスを呼び出すとき

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); 
    } 
} 

後で、あなたはマーシャリングクラスに(この場合は、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オブジェクトをマーシャリングしています。

+0

完全なソースコードを提供できますか? – Rajapandian

+0

素敵な答え+1 @ダン・ハワード –

+0

arraylistを含むカスタムクラスのマーシャルを書く方法は? – Umair