3

我正在尝试通过 ksoap2 将复杂对象发送到 webmethod。IDE 执行 AndroidHttpTransport.call 命令时出现问题,它发送该错误;

java.lang.RuntimeException:无法序列化:[webServiceClasses.movementItem@4123d840]

我将参数发送到下面的 webmethod;

[WebMethod]
        public TransferReturn ApplyVanToVanMovement(vanToVanMovement vMovement)
        {
            OracleConnection opCnn = new       OracleConnection(Settings.Instance.GetConnectionString());
            opCnn.Open();
            DBOperations dbOp = new DBOperations();

         .
         .
         .
        }

这是我将参数发送到 webmethod 的代码;

public static TransferReturn ApplyVanToVanMovement(TransferReturn pTransferReturn, vanToVanMovement vMovement)
        throws Exception {

    String NAMESPACE = "http://tempuri.org/";
    String METHOD_NAME = "ApplyVanToVanMovement";
    String SOAP_ACTION = "http://tempuri.org/ApplyVanToVanMovement";
    String URL;
    if (Settings.instance().getDocNum().isApn == 0)
        URL = Settings.instance().getDocNum().WANIP + Settings.instance().getDocNum().WANTransferServiceUrl;
    else
        URL = Settings.instance().getDocNum().LANIP + Settings.instance().getDocNum().LANTransferServiceUrl;


    PropertyInfo pi = new PropertyInfo();
    pi.setName("vanToVanMovement");
    pi.setValue(vMovement);
    pi.setType(vMovement.getClass());
    Request.addProperty(pi);

    ArrayList<movementItem> alMi = vMovement.getItemCollectionField();

    for (int i = 0; i < alMi.size(); i++) {
        PropertyInfo pi2 = new PropertyInfo();
        pi2.setName("movementItem" + i);
        pi2.setValue(alMi.get(i));
        pi2.setType(movementItem.class);
        Request.addProperty(pi2);
    }

    /*
     * Set the web service envelope
     */
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;
    envelope.setOutputSoapObject(Request);

    envelope.addMapping(NAMESPACE, "vanToVanMovement", new vanToVanMovement().getClass());

    for (int i = 0; i < alMi.size(); i++) {
        envelope.addMapping(NAMESPACE, "movementItem" + i, movementItem.class);
    }

    MarshalDouble marshaldDouble = new MarshalDouble();
    marshaldDouble.register(envelope);

    AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);

    /*
     * Call the web service and retrieve result ... how luvly <3
     */SoapObject response = null;
    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);
        response = (SoapObject) envelope.getResponse();

    } catch (Exception e) {
        e.printStackTrace();
    }
    // (SoapObject) wsClass.InvokeMethodMarshal(pInfo);

    pTransferReturn = (TransferReturn) DBLayout.setSoapObjectToClass(response, pTransferReturn);
    return pTransferReturn;
}

我的类,第一个是我发送的参数,第二个是第一个作为数组的属性(我用 Vector 而不是 ArrayList 尝试了同样的事情,没有任何改变。);

public class vanToVanMovement implements WebServiceReturn {
private long companyIdField;

private long branchIdField;

private long createdUserIdField;

private long fromWarehouseIdField;

private long toWarehouseIdField;

private long representativeIdField;

private long routeIdField;

private long vehicleIdField;

private ArrayList<movementItem> itemCollectionField;

public vanToVanMovement() {

}



public long getCompanyIdField() {
    return companyIdField;
}

public void setCompanyIdField(long companyIdField) {
    this.companyIdField = companyIdField;
}

public long getBranchIdField() {
    return branchIdField;
}

public void setBranchIdField(long branchIdField) {
    this.branchIdField = branchIdField;
}

public long getCreatedUserIdField() {
    return createdUserIdField;
}

public void setCreatedUserIdField(long createdUserIdField) {
    this.createdUserIdField = createdUserIdField;
}

public long getFromWarehouseIdField() {
    return fromWarehouseIdField;
}

public void setFromWarehouseIdField(long fromWarehouseIdField) {
    this.fromWarehouseIdField = fromWarehouseIdField;
}

public long getToWarehouseIdField() {
    return toWarehouseIdField;
}

public void setToWarehouseIdField(long toWarehouseIdField) {
    this.toWarehouseIdField = toWarehouseIdField;
}

public long getRepresentativeIdField() {
    return representativeIdField;
}

public void setRepresentativeIdField(long representativeIdField) {
    this.representativeIdField = representativeIdField;
}

public long getRouteIdField() {
    return routeIdField;
}

public void setRouteIdField(long routeIdField) {
    this.routeIdField = routeIdField;
}

public long getVehicleIdField() {
    return vehicleIdField;
}

public void setVehicleIdField(long vehicleIdField) {
    this.vehicleIdField = vehicleIdField;
}

public ArrayList<movementItem> getItemCollectionField() {
    return itemCollectionField;
}

public void setItemCollectionField(ArrayList<movementItem> itemCollectionField) {
    this.itemCollectionField = itemCollectionField;
}

public Object getProperty(int index) {
    switch (index) {
    case 0:
        return companyIdField;
    case 1:
        return branchIdField;
    case 2:
        return createdUserIdField;
    case 3:
        return fromWarehouseIdField;
    case 4:
        return toWarehouseIdField;
    case 5:
        return representativeIdField;
    case 6:
        return routeIdField;
    case 7:
        return vehicleIdField;
    case 8:
        return itemCollectionField;

    default:
        return null;
    }
}

public int getPropertyCount() {
    return 9;
}

public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo pInfo) {
    switch (index) {
    case 0:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "companyIdField";
        break;
    case 1:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "branchIdField";
        break;
    case 2:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "createdUserIdField";
        break;
    case 3:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "fromWarehouseIdField";
        break;
    case 4:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "toWarehouseIdField";
        break;
    case 5:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "representativeIdField";
        break;
    case 6:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "routeIdField";
        break;
    case 7:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "vehicleIdField";
        break;
    case 8:
        pInfo.type = PropertyInfo.OBJECT_CLASS;
        pInfo.name = "itemCollectionField";
        break;

    default:
        break;
    }
}

public void setProperty(int index, Object obj) {
    switch (index) {
    case 0:
        companyIdField = Long.valueOf(obj.toString());
        break;
    case 1:
        branchIdField = Long.valueOf(obj.toString());
        break;
    case 2:
        createdUserIdField = Long.valueOf(obj.toString());
        break;
    case 3:
        fromWarehouseIdField = Long.valueOf(obj.toString());
        break;
    case 4:
        toWarehouseIdField = Long.valueOf(obj.toString());
        break;
    case 5:
        representativeIdField = Long.valueOf(obj.toString());
        break;
    case 6:
        routeIdField = Long.valueOf(obj.toString());
        break;
    case 7:
        vehicleIdField = Long.valueOf(obj.toString());
        break;
    case 8:
        itemCollectionField = (ArrayList<movementItem>) obj;
        break;

    default:
        break;
    }
}

public int getArrayNumber(String s) {

    int i = -1;

    if (s.equals("companyIdField"))
        i = 0;

    if (s.equals("branchIdField"))
        i = 1;

    if (s.equals("createdUserIdField"))
        i = 2;

    if (s.equals("fromWarehouseIdField"))
        i = 3;

    if (s.equals("toWarehouseIdField"))
        i = 4;

    if (s.equals("representativeIdField"))
        i = 5;

    if (s.equals("routeIdField"))
        i = 6;

    if (s.equals("vehicleIdField"))
        i = 7;

    if (s.equals("itemCollectionField"))
        i = 8;

    return i;
}

}

public class movementItem implements WebServiceReturn {
private long itemIdField;

private long unitSetIdField;

private long unitIdField;

private long unitSetId2Field;

private long unitId2Field;

private double convFact1Field;

private double convFact2Field;

private double planQuantityField;

private double planQuantity1Field;

private double planQuantity2Field;

public movementItem() {

}

public long getItemIdField() {
    return itemIdField;
}

public void setItemIdField(long itemIdField) {
    this.itemIdField = itemIdField;
}

public long getUnitSetIdField() {
    return unitSetIdField;
}

public void setUnitSetIdField(long unitSetIdField) {
    this.unitSetIdField = unitSetIdField;
}

public long getUnitIdField() {
    return unitIdField;
}

public void setUnitIdField(long unitIdField) {
    this.unitIdField = unitIdField;
}

public long getUnitSetId2Field() {
    return unitSetId2Field;
}

public void setUnitSetId2Field(long unitSetId2Field) {
    this.unitSetId2Field = unitSetId2Field;
}

public long getUnitId2Field() {
    return unitId2Field;
}

public void setUnitId2Field(long unitId2Field) {
    this.unitId2Field = unitId2Field;
}

public double getConvFact1Field() {
    return convFact1Field;
}

public void setConvFact1Field(double convFact1Field) {
    this.convFact1Field = convFact1Field;
}

public double getConvFact2Field() {
    return convFact2Field;
}

public void setConvFact2Field(double convFact2Field) {
    this.convFact2Field = convFact2Field;
}

public double getPlanQuantityField() {
    return planQuantityField;
}

public void setPlanQuantityField(double planQuantityField) {
    this.planQuantityField = planQuantityField;
}

public double getPlanQuantity1Field() {
    return planQuantity1Field;
}

public void setPlanQuantity1Field(double planQuantity1Field) {
    this.planQuantity1Field = planQuantity1Field;
}

public double getPlanQuantity2Field() {
    return planQuantity2Field;
}

public void setPlanQuantity2Field(double planQuantity2Field) {
    this.planQuantity2Field = planQuantity2Field;
}

public Object getProperty(int index) {
    switch (index) {

    case 0:
        return itemIdField;
    case 1:
        return unitSetIdField;
    case 2:
        return unitIdField;
    case 3:
        return unitSetIdField;
    case 4:
        return unitSetId2Field;
    case 5:
        return unitId2Field;
    case 6:
        return convFact1Field;
    case 7:
        return convFact2Field;
    case 8:
        return planQuantityField;
    case 9:
        return planQuantity1Field;

    default:
        return null;
    }
}

public int getPropertyCount() {
    return 10;
}

public void getPropertyInfo(int index, Hashtable arg1, PropertyInfo pInfo) {
    switch (index) {
    case 0:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "itemIdField";
        break;
    case 1:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "unitSetIdField";
        break;
    case 2:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "unitIdField";
        break;
    case 3:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "unitSetId2Field";
        break;
    case 4:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "unitId2Field";
        break;
    case 5:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "convFact1Field";
        break;
    case 6:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "convFact2Field";
        break;
    case 7:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "planQuantityField";
        break;
    case 8:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "planQuantity1Field";
        break;
    case 9:
        pInfo.type = PropertyInfo.LONG_CLASS;
        pInfo.name = "planQuantity2Field";
        break;

    default:
        break;
    }
}

public void setProperty(int index, Object obj) {
    switch (index) {
    case 0:
        itemIdField = Long.valueOf(obj.toString());
        break;
    case 1:
        unitSetIdField = Long.valueOf(obj.toString());
        break;
    case 2:
        unitIdField = Long.valueOf(obj.toString());
        break;
    case 3:
        unitSetId2Field = Long.valueOf(obj.toString());
        break;
    case 4:
        unitId2Field = Long.valueOf(obj.toString());
        break;
    case 5:
        convFact1Field = (double)Double.valueOf(obj.toString());
        break;
    case 6:
        convFact2Field = (double)Double.valueOf(obj.toString());
        break;
    case 7:
        planQuantityField = (double)Double.valueOf(obj.toString());
        break;
    case 8:
        planQuantity1Field = (double)Double.valueOf(obj.toString());
        break;
    case 9:
        planQuantity2Field = (double)Double.valueOf(obj.toString());
        break;

    default:
        break;
    }
}

public int getArrayNumber(String s) {

    int i = -1;

    if (s.equals("itemIdField"))
        i = 0;

    if (s.equals("unitSetIdField"))
        i = 1;

    if (s.equals("unitIdField"))
        i = 0;

    if (s.equals("unitSetId2Field"))
        i = 1;

    if (s.equals("unitId2Field"))
        i = 0;

    if (s.equals("convFact1Field"))
        i = 1;

    if (s.equals("convFact2Field"))
        i = 0;

    if (s.equals("planQuantityField"))
        i = 1;

    if (s.equals("planQuantity1Field"))
        i = 0;

    if (s.equals("planQuantity2Field"))
        i = 1;

    return i;
}

这两个类实现 from ;

public interface WebServiceReturn extends KvmSerializable {

    public int getArrayNumber(String s);

}

最后是我的编组方法,用于序列化双打;

   public class MarshalDouble implements Marshal {
    public Object readInstance(XmlPullParser parser, String namespace, String name,
                           PropertyInfo expected) throws IOException, XmlPullParserException {
        return Double.parseDouble(parser.nextText());
    }


    public void register(SoapSerializationEnvelope cm) {
        cm.addMapping("http://tempuri.org/", "double", Double.class, this);
    }


    public void writeInstance(XmlSerializer writer, Object obj) throws IOException {
        writer.text(obj.toString());
    }
}
4

0 回答 0