0

クライアント プロジェクトと Web サービス プロジェクトで定義された、シリアライズ可能を実装するカスタム オブジェクトがあります。そのオブジェクトを SOAP メッセージを介してバイト配列として渡したいのですが、これを実行しようとすると、オブジェクトを再構築する Web サービスのメソッドに、次のスタックのようにクラスが見つからないという例外があります。

java.lang.ClassNotFoundException: com.myproject.biosign.client.vo.Istante

例外で参照されるパスは、クライアント内のオブジェクトのパスであり、当然のことながら Web サービスでは見つからないことに注意してください。Web サービスで同じオブジェクトの定義を使用してオブジェクトを再構築するにはどうすればよいですか?

オブジェクトの変換、送信、および逆変換のコードに従います。

クライアントメソッド:

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

    try {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutput out = null;

          out = new ObjectOutputStream(bos);   
          out.writeObject(istanti.get(0));
          byte[] yourBytes = bos.toByteArray();

          out.close();
          bos.close();

        request.addProperty("lista", yourBytes);                

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.dotNet = false;
        envelope.setOutputSoapObject(request);

        Marshal floatMarshal = new MarshalFloat();
        floatMarshal.register(envelope);
        new MarshalBase64().register(envelope);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;

        androidHttpTransport.call(SOAP_ACTION, envelope);

WS メソッドでは:

ByteArrayInputStream bis = new ByteArrayInputStream(lista);
          ObjectInput in = null;
          try {
            in = new ObjectInputStream(bis);
            Object o = in.readObject(); 
            Istante ist = (Istante) o;
            System.out.println("eccoci" + ist.getXCoord());
            bis.close();
            in.close();
4

1 に答える 1

0

Java のシリアライゼーションをそのまま使用するにはIstante、クライアントとサーバーの両方にクライアント クラスをクラスパスに含める必要があります。

のバイト コードをサーバーに送信Istanteし、カスタム クラスローダーを使用してそのクラスを解決することができます。しかし、これを行わないことを強くお勧めします。素敵でシンプルな JSON 交換形式の方が適しています。

Istante最も簡単な解決策は、サーバーのクラスパスにjar を含めることです。

于 2012-11-10T01:21:08.550 に答える