我想通過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)
如果任何一個幫助我
謝謝你,但正如我在代碼中提到我用SoapObject和的PropertyInfo類。我也試過KvmSerializable [本教程](http://seesharpgears.blogspot.in/2010/10/ksoap-android-web-service-tutorial-with.html),但它沒有解決。 – Ghorbani
您可以將它與您的自定義'ReceptionCommitItem'類一起使用。但是KSoap默認情況下只能序列化一些基本類型(以及實現'KvmSerializable'或'Marshal'接口的類型)。你可以實現這個接口之一,或者你應該寫對象的每個屬性。 – esentsov
我在ksoap2的src(org/ksoap2/serialization /)中檢查了SoapSerializationEnvelope類,並且我發現我也應該序列化了ReceptionCommitItem的Enum屬性。 – Ghorbani