2011-06-13 101 views
2

我在從Android設備使用KSOAP2發送到.NET Web服務的複雜對象的屬性上出現「強制轉換」錯誤。該屬性是一個複雜對象的數組。互聯網上的文檔幫助我發送和接收簡單的數據類型(字符串,整數,日期等)。我甚至可以從.NET Web服務中讀取一組複雜的對象。我只是無法將一組複雜的對象發送回Web服務。請幫忙。這是我有:複雜對象託管複雜對象到.NET Web服務的陣列

環境: 客戶端= Android開發使用最新的KSOAP lib進行通信。 服務器= .NET Web服務(Visual Studio 2008)。注意:這不是WCF。

.NET Web服務:

[SoapRpcMethod(), WebMethod]  
public void WriteCaseInfo(CaseInformation caseInfo) 
{ 
    ... 
    ... 
} 


Android客戶端代碼:

父類被當成復參數:

public class CaseInformation extends IABaseKSoap2Serializable 
{ 
public String Name; 
public int Id; 
public Vector<MultiPartDataElement> SiteListItems = new Vector<MultiPartDataElement>(); 

@Override 
public Object getProperty(int arg0) 
{ 
    switch(arg0) 
    { 
    case 0: 
     return Name; 
    case 1: 
     return Id; 
    case 2: 
     return SiteListItems;   
    } 

    return null; 
} 

@Override 
public int getPropertyCount() 
{ 
    return 3; 
} 

@Override 
public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo info) 
{ 
    switch(index) 
    { 
    case 0: 
     info.type = PropertyInfo.STRING_CLASS; 
     info.name = "Name"; 
     break; 
    case 1: 
     info.type = PropertyInfo.INTEGER_CLASS; 
     info.name = "Id"; 
     break; 
    case 2: 
     info.type = new Vector<MultiPartDataElement>().getClass(); 
     info.name = "SiteListItems"; 
     break; 

    default:break; 
    } 
} 

@Override 
public void setProperty(int index, Object value) 
{ 
    switch(index) 
    { 
    case 0: 
     Name = value.toString(); 
     break; 
    case 1: 
     Id = Integer.parseInt(value.toString()); 
     break; 
    case 2: 
     SiteListItems = (Vector<MultiPartDataElement>)value; 
    break; 

    default: 
     break; 
    } 
} 

}

注意:如果我從客戶端代碼和Web服務中刪除SiteListItems屬性,則一切正常。


在陣列中使用的上述對象物的內部複雜的類:

public class MultiPartDataElement extends IABaseKSoap2Serializable 
{ 
public int Id; 
public String Name; 

// default constructor 
public MultiPartDataElement() 
{ 

} 

// overloaded constructor 
public MultiPartDataElement(int id, String name) 
{ 
    Id = id; 
    Name = name; 
} 

@Override 
public Object getProperty(int arg0) 
{ 
    switch(arg0) 
    { 
    case 0: 
     return Id; 
    case 1: 
     return Name; 
    } 

    return null;  
} 

@Override 
public int getPropertyCount() 
{ 
    return 2; 
} 

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

    case 1: 
     info.type = PropertyInfo.STRING_CLASS; 
     info.name = "Name"; 
     break; 
    default:break; 
    } 
} 

@Override 
public void setProperty(int index, Object value) 
{ 
    switch(index) 
    { 
    case 0: 
     Id = Integer.parseInt(value.toString()); 
     break; 
    case 1: 
     Name = value.toString(); 
     break; 
    default: 
     break; 
    } 
} 
} 


代碼發送對象作爲參數到.NET Web服務:

public static boolean WriteCaseInfo() 
{ 
    boolean status = false; 

    CaseInformation caseInfo = new CaseInformation(); 
    caseInfo.Id = 2725; 
    caseInfo.Name = "Craig M. Buck"; 

    caseInfo.SiteListItems = new Vector<MultiPartDataElement>(); 
    caseInfo.SiteListItems.add(new MultiPartDataElement(1, "CMB1")); 
    caseInfo.SiteListItems.add(new MultiPartDataElement(2, "CMB2")); 

    String methodName = "WriteCaseInfo"; 
    SoapObject request = new SoapObject(NAMESPACE, methodName);  
    request.addProperty("caseInfo", caseInfo); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.bodyOut = request; 
    envelope.dotNet = false; 
    envelope.encodingStyle = SoapSerializationEnvelope.XSD; 

    envelope.addMapping(IABaseKSoap2Serializable.NAMESPACE, "MultiPartDataElement", new MultiPartDataElement().getClass()); 
    envelope.addMapping(IABaseKSoap2Serializable.NAMESPACE, "CaseInformation", new CaseInformation().getClass()); 

    HttpTransportSE transport = new HttpTransportSE(WebAPIURL + CaseServicesURL); 
    transport.debug = true; 
    transport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 

    try 
    { 
     List<HeaderProperty> headers = BuildHeader(); 

     transport.call(NAMESPACE + methodName, envelope, headers); 
     String requestDump = transport.requestDump; 
     String soapDump = transport.responseDump; 
     SoapObject response = (SoapObject) envelope.bodyIn; 

     if(response != null) 
      status = new Boolean(response.getProperty(0).toString()); 
    } 
    catch(Exception e) 
    { 
     status = false; 
    } 

    return status; 
} 

從KSOAP請求轉儲:

<?xml version="1.0" encoding="utf-8"?><v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"><v:Header /><v:Body><n0:WriteCaseInfo id="o0" c:root="1" xmlns:n0="http://www.medical.draeger.com/webservices/"><caseInfo i:type="n1:CaseInformation" xmlns:n1="http://www.medical.draeger.com/webservices/encodedTypes"><Name i:type="d:string">Craig M. Buck</Name><Id i:type="d:int">2725</Id><SiteListItems i:type="c:Array" c:arrayType="d:anyType[2]"><item i:type="n1:MultiPartDataElement"><Id i:type="d:int">1</Id><Name i:type="d:string">CMB1</Name></item><item i:type="n1:MultiPartDataElement"><Id i:type="d:int">2</Id><Name i:type="d:string">CMB2</Name></item></SiteListItems></caseInfo></n0:WriteCaseInfo></v:Body></v:Envelope> 

注:我認爲這個問題是,是,數組被定義爲「anyTyp」,而不是MultiPartDataElement - > ...問題是我究竟錯在這裏幹什麼?

響應轉儲從KSOAP(呼叫後):

的SoapException:服務器無法讀取請求。 --- > System.InvalidOperationException:XML文檔(1,828)中存在錯誤。 --- > System.InvalidCastException:無法將類型System.Object []的對象分配給類型爲Draeger.IT.Platform.Web.WebServices.MultiPartDataElement []的對象

回答

0

你可以這樣做:

int propertyCount = countryDetails.getPropertyCount(); 
ArrayList list = new ArrayList(propertyCount); 
lv_arr = new String[propertyCount]; 
for (int i = 0; i < propertyCount; i++) { 
    Object property = countryDetails.getProperty(i); 
    if (property instanceof SoapObject) { 
    SoapObject countryObj = (SoapObject) property; 
    String countryName = countryObj.getProperty("countryName").toString(); 
    list.add(countryName); 

    } 
} 

來自:Parsing ksoap2 response