2011-04-20 53 views
1

我有Android应用程序,其中一些数据发送到.NET Web服务(WCF不,简单的Web服务) 的Android应用程序,我有课,在服务器上实现KvmSerializable接口kSoap2发送收集

public class OrderDTO extends BaseSoapObject 
{ 
    public int ID; 
    public Date OrderDate; 
    public UserDTO Owner; 
    public Vector<OrderItemDTO> Products; 

    @Override 
public void getPropertyInfo(int index, Hashtable properties, PropertyInfo info) 
{ 
    switch(index) 
    { 
     case 0: 
      info.type = PropertyInfo.INTEGER_CLASS; 
      info.name = "ID"; 
      break; 

     case 1: 
      info.type = MarshalDate.DATE_CLASS; 
      info.name = "OrderDate"; 
      break; 

     case 2: 
      info.type = UserDTO.class; 
      info.name = "Owner"; 
      break; 

     case 3: 
      info.type = PropertyInfo.VECTOR_CLASS; 
      info.name = "Products"; 
      break; 

     default: 
      break; 
    }  
} 
} 

侧我有类

public class OrderDTO 
{ 
    public virtual int ID { get; set; } 
    public virtual UserDTO Owner { get; set; } 
    public virtual DateTime OrderDate { get; set; } 
    public virtual OrderItemDTO[] Products { get; set; } 

    public OrderDTO() 
    {  
    } 
} 

和web服务方法

[的WebMethod]

public void SaveOrder(OrderDTO order) 
{ 
    try 
    { 
     // do somthing 
    } 
    catch (Exception e) 
    { 

    } 
    finally 
    { 
    } 

}

我有成功的呼叫从机器人,现场所有人和订购日期这种方法是正确填写,但产品字段为空(不为空,只是空)

我尝试使用数组,ArrayList和Vector - 没有改变

,当我看到请求转储和看到的唯一的不同有收集的项目(标签名称:

<Products i:type="c:Array" c:arrayType="d:anyType[1]"> 
    <item i:type="n0:OrderItemDTO"> 
     <ID i:type="d:int">0</ID> 
     <AssignedCode i:type="d:string">0001</AssignedCode> 
     <Count i:type="d:int">5</Count> 
    </item> 
</Products> 

在我的WSDL:

<Products> 
    <OrderItemDTO> 
     <ID>int</ID> 
     <Count>int</Count> 
     <AssignedCode>string</AssignedCode> 
    </OrderItemDTO> 
    <OrderItemDTO> 
     <ID>int</ID> 
     <Count>int</Count> 
     <AssignedCode>string</AssignedCode> 
    </OrderItemDTO> 
</Products> 

和互动的服务我的Android代码:

OrderDTO dto = new OrderDTO(order); 
SoapObject request = new SoapObject(Namespace, SaveOrderMethod); 

PropertyInfo pi = new PropertyInfo(); 
pi.setName("order"); 
pi.setValue(dto); 
pi.setType(dto.getClass()); 
request.addProperty(pi); 

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope.dotNet = true; 
envelope.setOutputSoapObject(request); 

envelope.addMapping(Namespace, "OrderItemDTO", new OrderItemDTO().getClass()); 
envelope.addMapping(Namespace, "UserDTO", new UserDTO().getClass()); 
envelope.addMapping(Namespace, "OrderDTO", new OrderDTO().getClass()); 

Marshal dateMarshal = new MarshalDate(); 
dateMarshal.register(envelope); 

HttpTransportSE androidHttpTransport = new HttpTransportSE(Url); 
androidHttpTransport.debug = true; 

try 
{ 
    androidHttpTransport.call(SaveOrderSoapAction, envelope); 
} 
catch (Exception e) 
{ 
    Log.e(Tag, e.getMessage()); 
} 
+0

我已经找到答案 我需要添加一些代码OrderDTO.getPropertyInfo方法 的PropertyInfo elementInfo =新的PropertyInfo(); elementInfo.name =“OrderItemDTO”; elementInfo.type = new OrderItemDTO()。getClass(); \t \t \t \t info.elementType = elementInfo; – 2011-04-20 09:36:52

回答

0

我已经找到了答案,我需要添加一些代码OrderDTO.getPropertyInfo方法的PropertyInfo elementInfo =新的PropertyInfo(); elementInfo.name =“OrderItemDTO”; elementInfo.type = new OrderItemDTO()。getClass(); info.elementType = elementInfo;