4

ksoap2 api を使用して、Android で .net Web サービスを呼び出す必要があります。私のコードは、パラメーターを String または int として渡すためにうまく機能しています。しかし、「java.lang.RuntimeException: Cannot serialize: java.util.GregorianCalendar.....」と表示され、Calendar オブジェクトをパラメーターとして渡します。日付を文字列に変換し、日付オブジェクトに解析しましたが、うまくいきません。

誰でも私を助けてください。

ありがとうございました。

4

4 に答える 4

3

日付を文字列として渡すのが最も簡単な方法ですが、Date として渡したい場合は、Marshal インターフェイスのクラスを作成し、エンベロープを登録する必要があります。これは基本的に、日付の扱い方を KSOAP に指示します。この投稿を検討できます:

KSOAP マーシャル インターフェイスの実装

お役に立てれば。

于 2010-11-24T16:43:43.863 に答える
2

最初に、MarshalDate クラスを作成するための以下のコードを入力します。

package Marshals;

import java.io.IOException;
import java.util.Date;

import org.kobjects.isodate.IsoDate;
import org.ksoap2.serialization.Marshal;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;

public class MarshalDate implements Marshal
{

public static Class DATE_CLASS = new Date().getClass();

    public Object readInstance(XmlPullParser parser, String namespace, String name, PropertyInfo expected) 
    throws IOException, XmlPullParserException 
     {
        //IsoDate.DATE_TIME=3
     String Test1 = parser.nextText();
        return IsoDate.stringToDate(parser.nextText(), IsoDate.DATE_TIME);


    }
    public void register(SoapSerializationEnvelope cm) 
    {
         cm.addMapping(cm.xsd, "dateTime", MarshalDate.DATE_CLASS, this);
         // "DateTime" is wrong use "dateTime" ok

    }
    public void writeInstance(XmlSerializer writer, Object obj) 
    throws IOException 
    {
      String Test="";
      Test = IsoDate.dateToString((Date) obj, IsoDate.DATE_TIME);
         writer.text(IsoDate.dateToString((Date) obj, IsoDate.DATE_TIME));
    }

}

// クライアント コード内:

String result3="";
    try
    {

      String soapAction3 = "http://tempuri.org/HelloWorldDate";
      SoapObject rpc3 = new SoapObject(serviceNamespace, "HelloWorldDate");
      PropertyInfo pi = new PropertyInfo();
      pi.name= "Date"; // name of the parameter in your dotnet variable
      pi.type =  MarshalDate.DATE_CLASS;
      // add property with your  value, I use new Date(System.currentTimeMillis() 
      rpc3.addProperty(pi, new Date(System.currentTimeMillis()));
      SoapSerializationEnvelope envelope3 = new SoapSerializationEnvelope(SoapEnvelope.VER11);
     envelope3.bodyOut = rpc3;     envelope3.dotNet = false;
     MarshalDate md = new MarshalDate();
     md.register(envelope3);
     envelope3.setOutputSoapObject(rpc3);

     HttpTransport ht3 = new HttpTransport(serviceUrl);
     ht3.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
     ht3.debug = true;
     ht3.call(soapAction3, envelope3);        
     result3= envelope3.getResponse().toString();

    }        
    catch(Exception ex)
    {
     //if we get an exception we'll just write the msg to the screen.
     result3 = ex.toString();


    }

    don't forget  envelope3.dotNet = false; it is very important otherwise you will 
    send null date value to .net.
于 2011-01-15T02:32:15.390 に答える
1

以下は私のために働いた:

  1. MarshalDateorg.ksoap2.serialization.MarshalDate(からKSOAP2)

  2. メソッド パラメータ: 注意してくださいparam2.type = MarshalDate.DATE_CLASS;

     // Your date may have time too?
     SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMM d, yyyy");
     java.util.Date date = null;
     try {
        date = formatter.parse(p_obj.LoginUser_Created_On);
     } catch (ParseException e) {
        //My handler
     }
    
     ////
     PropertyInfo wsParams2 = new PropertyInfo();
     // Set Name
     wsParams2.setName("d_LoginUser_Created_On");
     // Set Value
     ////////////////////////////////////////
     wsParams2.setValue(date);//sqlStartDate);
     // Set dataType
     //wsParams2.setType(java.sql.Date.class); // do not work
     //wsParams2.setType(java.util.Date.class);  // do not work
     wsParams2.type =  MarshalDate.DATE_CLASS; // works
     ////////////////////////////////////////
     // Add the property to request object
     request.addProperty(wsParams2);
    

3.追加の md.register(envelope); に注意してください。

    // Create envelope
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
        SoapEnvelope.VER11);
    //Set envelope as dotNet
    envelope.dotNet = true;
    // Set output SOAP object
    envelope.setOutputSoapObject(request);

    ////////////////////////////////////////
    //
    MarshalDate md = new MarshalDate();
    md.register(envelope);
    ////////////////////////////////////////
于 2016-06-07T03:47:20.877 に答える
0

さらに詳細を入力する必要があります。一般に、日付では、フォーマットを知っていて、それを文字列としてやり取りする必要があります(とにかく..それが最も簡単です)。

于 2010-11-04T20:52:57.193 に答える