简体   繁体   English

无法将序列化对象从android传递到C#Web服务

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

I want to send an object from android app to c# web service by ksoap2. 我想通过ksoap2将对象从android应用发送到c#Web服务。 The webService method get a ReceptionCommitItem object. webService方法获取一个ReceptionCommitItem对象。 this object defined in C# webService as blew : 这个对象在C#webService中定义为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: 我在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: 以下是示例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>

I sent ReceptionCommitItem to webService by ksoap2 in code: 我通过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;
}

when i run app httpTransport.call(SOAP_ACTION, soapEnvelope); 当我运行应用程序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 如果有人帮助我,我将不胜感激

Ksoap doesn't support automatic serialization of custom objects. Ksoap不支持自定义对象的自动序列化。 You should serialize your object property by property using SoapObject and PropertyInfo classes. 您应该使用SoapObjectPropertyInfo类按属性序列化对象属性。 Or you can make your class serializable by implementing KvmSerializable interface. 或者,您可以通过实现KvmSerializable接口使您的类可序列化。 See this tutorial for example. 例如,请参阅本教程

我检查了ksoap2的src(org / ksoap2 / serialization /)中的SoapSerializationEnvelope类,发现我也应该序列化ReceptionCommitItem的Enum属性。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM