【问题标题】:Android 1.6 ksoap2 "RuntimeException: Cannot serialize: java.util.GregorianCalendar..", while passing datetime parameterAndroid 1.6 ksoap2“RuntimeException:无法序列化:java.util.GregorianCalendar ..”,同时传递 datetime 参数
【发布时间】:2016-06-07 13:02:54
【问题描述】:

我必须使用 ksoap2 api 在 android 中调用 .net Web 服务。 我的代码在将参数作为 String 或 int 传递时运行良好。但它显示“java.lang.RuntimeException:无法序列化:java.util.GregorianCalendar.....”,同时将日历对象作为参数传递。我将日期转换为字符串并将其解析为日期对象,但它不起作用。

谁能帮帮我。

谢谢。

【问题讨论】:

标签: android ksoap2


【解决方案1】:

传递日期最简单的方法是作为字符串传递,但是如果你想传递它作为日期,那么你需要编写一个Marshal接口的类并注册信封。这基本上告诉 KSOAP 如何处理日期。你可以考虑这个帖子:

Implementing KSOAP Marshal Interface

希望这会有所帮助。

【讨论】:

  • 感谢您的宝贵回复。让我试试你的方法。
【解决方案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.

【讨论】:

    【解决方案3】:

    以下内容对我有用:

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

    【讨论】:

      【解决方案4】:

      您需要提供更多详细信息。一般来说,对于日期,您需要知道格式并将其作为字符串传入和传出(嗯..这是最简单的)。

      【讨论】:

      • 日历 cal = Calendar.getInstance(); SoapObject request = new SoapObject(NAMESPACE,METHOD_NAME);
      • request.addProperty("Operation_DateTime",cal);
      • 您将其作为日历传入。您需要将其作为字符串传递。看看 SimpleDateFormat 类的初学者。
      • SimpleDateFormat 以字符串形式给我日期。但我必须将参数作为日期时间传递。当我再次将其转换为日期时,其日期格式仍为默认格式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 2023-03-20
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多