2013-10-10 50 views
0

我想通過ksoap2從android應用程序發送一個對象到c#web服務。 webService方法獲得一個ReceptionCommitItem對象。在C#web服務定義爲自爆 此目的:無法將序列化對象從android傳遞到C#web服務

[Serializable] 
[XmlType(TypeName = "RCI")] 
public class ReceptionCommitItem 
{ 
    [XmlAttribute(AttributeName = "Id")] 
    public int ReceptionNumber { get; set; } 
    [XmlAttribute(AttributeName = "St")] 
    public ReceptionStatuses NewStatus { get; set; } 
    [XmlAttribute(AttributeName = "PRN")] 
    public string PartRequestNumber { get; set; } 
    [XmlAttribute(AttributeName = "SN")] 
    public string SerialNumber { get; set; } 
    [XmlAttribute(AttributeName = "BId")] 
    public int BrandId { get; set; } 
    [XmlAttribute(AttributeName = "PgId")] 
    public int ProductGroupId { get; set; } 
    [XmlAttribute(AttributeName = "SgId")] 
    public int SubgroupId { get; set; } 
    [XmlAttribute(AttributeName = "MId")] 
    public int ModelId { get; set; } 
    [XmlAttribute(AttributeName = "SId")] 
    public int SeriId { get; set; } 

    [XmlAttribute(AttributeName = "Ad")] 
    public string Address { get; set; } 

    [XmlAttribute(AttributeName = "HF")] 
    public bool HasFactorData { get; set; } 

    [XmlAttribute(AttributeName = "CR")] 
    public bool CommitReception { get; set; } 

    [XmlAttribute(AttributeName = "CP")] 
    public ReceptionChanges ChangedProperties { get; set; } 

    [XmlIgnore] 
    public bool HasConfilict; 

    public List<FactorPart> FactorParts { get; set; } 
    public List<FactorService> FactorServices { get; set; } 

    public ReceptionCommitItem() 
    { 
     this.CommitReception = true; 
     this.HasFactorData = false; 
     this.ChangedProperties=ReceptionChanges.Nothing; 
     FactorParts=new List<FactorPart>(); 
     FactorServices=new List<FactorService>(); 
    } 
} 

我實現這個類作爲在Java自爆:

import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Hashtable; 
import java.util.List; 
import java.util.Vector; 

import org.ayriksoft.entekhab.util.Enum.ReceptionChanges; 
import org.ayriksoft.entekhab.util.Enum.ReceptionStatuses; 
import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 
import org.simpleframework.xml.Attribute; 
import org.simpleframework.xml.Element; 


@Element(name = "item") 
public class ReceptionCommitItem implements Serializable { 

    @Attribute(name = "Id") 

public int ReceptionNumber; 

@Attribute(name = "St", required = false) 
public ReceptionStatuses NewStatus; 

@Attribute(name = "PRN", required = false) 
public String PartRequestNumber; 

@Attribute(name = "SN", required = false) 
public String SerialNumber; 

@Attribute(name = "BId") 
public int BrandId; 

@Attribute(name = "PgId") 
public int ProductGroupId; 

@Attribute(name = "SgId") 
public int SubgroupId; 

@Attribute(name = "MId") 
public int ModelId; 

@Attribute(name = "SId") 
public int SeriId; 

@Attribute(name = "Ad", required = false) 
public String Address; 

@Attribute(name = "HF") 
public boolean HasFactorData; 

@Attribute(name = "CR") 
public boolean CommitReception; 

@Attribute(name = "CP") 
public ReceptionChanges ChangedProperties; 

@Attribute(required = false) 
public boolean HasConfilict; 

public List<FactorPart> FactorParts; 

public List<FactorService> FactorServices; 


public int getReceptionNumber() { 
    return ReceptionNumber; 
} 

public void setReceptionNumber(int receptionNumber) { 
    ReceptionNumber = receptionNumber; 
} 

public ReceptionStatuses getNewStatus() { 
    return NewStatus; 
} 

public void setNewStatus(ReceptionStatuses newStatus) { 
    NewStatus = newStatus; 
} 

public String getPartRequestNumber() { 
    return PartRequestNumber; 
} 

public void setPartRequestNumber(String partRequestNumber) { 
    PartRequestNumber = partRequestNumber; 
} 

public String getSerialNumber() { 
    return SerialNumber; 
} 

public void setSerialNumber(String serialNumber) { 
    SerialNumber = serialNumber; 
} 

public int getBrandId() { 
    return BrandId; 
} 

public void setBrandId(int brandId) { 
    BrandId = brandId; 
} 

public int getProductGroupId() { 
    return ProductGroupId; 
} 

public void setProductGroupId(int productGroupId) { 
    ProductGroupId = productGroupId; 
} 

public int getSubgroupId() { 
    return SubgroupId; 
} 

public void setSubgroupId(int subgroupId) { 
    SubgroupId = subgroupId; 
} 

public int getModelId() { 
    return ModelId; 
} 

public void setModelId(int modelId) { 
    ModelId = modelId; 
} 

public int getSeriId() { 
    return SeriId; 
} 

public void setSeriId(int seriId) { 
    SeriId = seriId; 
} 

public String getAddress() { 
    return Address; 
} 

public void setAddress(String address) { 
    Address = address; 
} 

public boolean isHasFactorData() { 
    return HasFactorData; 
} 

public void setHasFactorData(boolean hasFactorData) { 
    HasFactorData = hasFactorData; 
} 

public boolean isCommitReception() { 
    return CommitReception; 
} 

public void setCommitReception(boolean commitReception) { 
    CommitReception = commitReception; 
} 

public ReceptionChanges getChangedProperties() { 
    return ChangedProperties; 
} 

public void setChangedProperties(ReceptionChanges changedProperties) { 
    ChangedProperties = changedProperties; 
} 

public boolean isHasConfilict() { 
    return HasConfilict; 
} 

public void setHasConfilict(boolean hasConfilict) { 
    HasConfilict = hasConfilict; 
} 

public List<FactorPart> getFactorParts() { 
    return FactorParts; 
} 

public void setFactorParts(List<FactorPart> factorParts) { 
    FactorParts = factorParts; 
} 

public List<FactorService> getFactorServices() { 
    return FactorServices; 
} 

public void setFactorServices(List<FactorService> factorServices) { 
    FactorServices = factorServices; 
} 

public ReceptionCommitItem() { 
    this.CommitReception = true; 
    this.HasFactorData = false; 
    this.ChangedProperties = ReceptionChanges.Nothing; 
    FactorParts=new ArrayList<FactorPart>(); 
    FactorServices=new ArrayList<FactorService>(); 
} 
} 

以下是一個示例SOAP 1.1請求:

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
    <CommitSingleReceiption xmlns="http://samplegroup.ir/"> 
     <item Id="int" St="-2 or -1 or 0 or 1 or 2 or 3 " PRN="string" SN="string" BId="int" PgId="int" SgId="int" MId="int" SId="int" Ad="string" HF="boolean" CR="boolean" CP="Nothing or Status or PartRequestNumber or ModelTree or Serial or Address"> 
     <FactorParts> 
      <FP Id="int" Q="unsignedByte" W="boolean" P="int" /> 
      <FP Id="int" Q="unsignedByte" W="boolean" P="int" /> 
     </FactorParts> 
     <FactorServices> 
      <FS Id="int" IF="boolean" W="boolean" Q="unsignedByte" SP="int" TP="int" G="unsignedByte" /> 
      <FS Id="int" IF="boolean" W="boolean" Q="unsignedByte" SP="int" TP="int" G="unsignedByte" /> 
     </FactorServices> 
     </item>  
    </CommitSingleReceiption> 
    </soap:Body> 
</soap:Envelope> 

我通過代碼中的ksoap2將ReceptionCommitItem發送到webService:

OPERATION_NAME = webServiceMethodName; 
SOAP_ACTION = WSDL_TARGET_NAMESPACE + OPERATION_NAME; 
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE, 
       OPERATION_NAME); 

PropertyInfo pi = new PropertyInfo(); 
pi.setName("ReceptionCommitItem"); 
pi.setValue((ReceptionCommitItem) itemValue); 
pi.setType(new ReceptionCommitItem().getClass()); 
request.addProperty("item", pi); 

SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);// running 1.1 
soapEnvelope.dotNet = true; 
soapEnvelope.setOutputSoapObject(request); 
soapEnvelope.addMapping(WSDL_TARGET_NAMESPACE, "ReceptionCommitItem", 
     new ReceptionCommitItem().getClass()); 

HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS); 
try { 
    httpTransport.debug = true; 
    httpTransport.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); 
    httpTransport.call(SOAP_ACTION, soapEnvelope); 
} catch (Exception e) { 
    throw e; 
} 

當我運行應用httpTransport.call(SOAP_ACTION,soapEnvelope);拋出一個異常:

**EXCEPTION NAME: java.lang.RuntimeException: Cannot serialize: ReceptionCommitItem : [email protected]** 
org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:679) 
org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:663) 
org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:632) 
org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:616) 
org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:673) 
org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:597) 
org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:192) 
org.ksoap2.transport.Transport.createRequestData(Transport.java:101) 
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:114) 
org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:90) 

如果任何一個幫助我

回答

0

我ksoap2的src檢查SoapSerializationEnvelope類(組織/ ksoap2 /系列化/),我發現,我應該序列ReceptionCommitItem的枚舉屬性太

1

KSOAP不支持自定義對象的自動序列化,我將感激。您應該使用SoapObjectPropertyInfo類按屬性序列化您的對象屬性。或者你可以通過實現KvmSerializable界面使你的課程可序列化。例如,請參閱this tutorial

+0

謝謝你,但正如我在代碼中提到我用SoapObject和的PropertyInfo類。我也試過KvmSerializable [本教程](http://seesharpgears.blogspot.in/2010/10/ksoap-android-web-service-tutorial-with.html),但它沒有解決。 – Ghorbani

+0

您可以將它與您的自定義'ReceptionCommitItem'類一起使用。但是KSoap默認情況下只能序列化一些基本類型(以及實現'KvmSerializable'或'Marshal'接口的類型)。你可以實現這個接口之一,或者你應該寫對象的每個屬性。 – esentsov

+0

我在ksoap2的src(org/ksoap2/serialization /)中檢查了SoapSerializationEnvelope類,並且我發現我也應該序列化了ReceptionCommitItem的Enum屬性。 – Ghorbani

相關問題