问题
I want to send an object from android app to c# web service by ksoap2. The webService method get a ReceptionCommitItem object. this object defined in C# webService as blew :
[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>();
}
}
I implemented this class as blew in 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>();
}
}
The following is a sample SOAP 1.1 request:
<?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>
I sent ReceptionCommitItem to webService by ksoap2 in code:
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;
}
when i run app httpTransport.call(SOAP_ACTION, soapEnvelope); throws an Exception :
**EXCEPTION NAME: java.lang.RuntimeException: Cannot serialize: ReceptionCommitItem : org.package.bean.ReceptionCommitItem@46022360**
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)
I will be appreciate if any one help me
回答1:
Ksoap doesn't support automatic serialization of custom objects. You should serialize your object property by property using SoapObject
and PropertyInfo
classes. Or you can make your class serializable by implementing KvmSerializable
interface. See this tutorial for example.
回答2:
I checked SoapSerializationEnvelope class in ksoap2's src (org/ksoap2/serialization/) and i found that I should Serialize Enum attribute of ReceptionCommitItem too
来源:https://stackoverflow.com/questions/19289123/can-not-pass-serialized-object-from-android-to-c-sharp-web-service