Can not pass Serialized object from android to C# web Service

|▌冷眼眸甩不掉的悲伤 提交于 2019-12-25 11:56:30

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!