Web services x JME x Serialização

5 respostas
V

Pessoal,

desenvolvi uma aplicação cliente em JME , uma aplicação servidor em desktop e o web services foi utilizado ksoap e kxml. Quando executo os programas e quando é feita uma chamada ao web service com uma string no parâmetro do método roda beleza. Mas o problema é quando eu envio objetos como parâmetro. Já tentei coloca-los em vector e enviar e nada, converti eles para array de bytes e nada tbm. Em todos os casos ele fala que não pode serializar: java.lang.RuntimeException: Cannot serialize: [B@1cb37664

Alguém sabe como posso contornar este problema?

No mais agradeço.

5 Respostas

V

[up] post editado, nova pergunta adicionada

P

viniciusams:
Pessoal,

desenvolvi uma aplicação cliente em JME , uma aplicação servidor em desktop e o web services foi utilizado ksoap e kxml. Quando executo os programas e quando é feita uma chamada ao web service com uma string no parâmetro do método roda beleza. Mas o problema é quando eu envio objetos como parâmetro. Já tentei coloca-los em vector e enviar e nada, converti eles para array de bytes e nada tbm. Em todos os casos ele fala que não pode serializar: java.lang.RuntimeException: Cannot serialize: [B@1cb37664

Alguém sabe como posso contornar este problema?

No mais agradeço.

A serialização é possível sim e não tem nada a ver com implementar uma interface igual ao que ocorre no J2SE.

Vamos recapitular o que é serializar: Serializar é o ato de pegar o estado atual de um objeto, transformar em um array de bytes e persistir em um banco, arquivo ou mesmo transmitir para outra máquina.

Sendo assim, sua tarefa é pegar o conteúdo deste objeto, escrever num array de bytes e enviar para a outra ponta, que sabe o objeto que está recebendo e como deserializar. Já fiz isto e funciona normalmente. É o feijão com arroz do ByteArrayInputStream/OutputStream/DataInputStream/OutputStream…

V
viniciusams:
converti eles para array de bytes e nada tbm. Em todos os casos ele fala que não pode serializar: java.lang.RuntimeException: Cannot serialize: [B@1cb37664

Boone, eu já até fiz isso:
Lembrando que eu estou usando ksoap e kxml

Lado Cliente quando vai enviar os dados:
public void enviarDados(Cliente cliente) throws IOException{
        ...
        Boolean resposta;
        byte[] clienteSerializado = cliente.persist();
        
        // Chama o WebService   
        SoapObject client = new  SoapObject(url,"cadastrarCliente");    
        client.addProperty("cliente",clienteSerializado);
        HttpTransport ht = new HttpTransport(url,"cadastrarCliente");
        resposta = (Boolean) ht.call(client);
        isClientAdded = resposta.booleanValue();
        ...        
    }
Lado no qual ambos Cliente e Servidor têm acesso: Classe Cliente
public byte[] persist() throws IOException {
        ByteArrayOutputStream bout = 
                           new ByteArrayOutputStream();
        DataOutputStream      dout = 
                          new DataOutputStream( bout );

        dout.writeUTF( getUsername() );
        dout.writeUTF( getSenha() );
        dout.writeUTF( getNome() );
        dout.writeUTF( getEndereco() );
        dout.writeUTF( getCep() );
        dout.writeUTF( getCpf() );
        dout.writeUTF( getNumCelular() );
        dout.writeUTF( getCodPIN() );
        dout.flush();

        return bout.toByteArray();
    }

    public void resurrect(byte[] data) throws IOException {
        ByteArrayInputStream bin = 
                      new ByteArrayInputStream( data );
        DataInputStream      din = 
                            new DataInputStream( bin );

        username = din.readUTF();
        senha = din.readUTF();
        nome = din.readUTF();
        endereco = din.readUTF();
        cep = din.readUTF();
        cpf = din.readUTF();
        numCelular = din.readUTF();
        codPIN = din.readUTF();
    }

Lado do servidor, Webservice:

public boolean cadastrarCliente(byte[] cliente) {
        return BDcliente.addCliente(cliente);
    }

Lembrando que eu faço isso e dá aquele erro que citei no começo deste post.

Consegue encontrar o meu erro?

valeu pela atenção

P

Com o código que mostrou não encontrei nada estranho.
Como forma de descobrir onde está o problema, recomendo você criar blocos try…catch para catar esta exceção e saber qual o trecho está gerando a Exception.
Do jeito que está hoje, você não sabe exatamente qual dos métodos (linha) está gerando a mesma.

V

boone, fiz o deploy e veja a minha análise:

na classe SoapWriter tem a seguinte chamada:

Object [] qName = classMap.getInfo (null, obj);

Agora veja o ClassMap , método getInfo:

public Object [] getInfo (Object type, Object instance) {

	if (type == null) {
	    if (instance instanceof SoapObject 
		|| instance instanceof SoapPrimitive)
		type = instance;
	    else 
		type = instance.getClass ();
	}

	...
	
	if ((type instanceof Class) 
	    && type != ElementType.OBJECT_CLASS) {
	    
	    Object [] tmp = (Object []) classToQName.get 
		(((Class) type).getName ());

	    if (tmp != null) return tmp;
	}

	return new Object [] {xsd, "anyType", null, null};
    }

Neste trecho, quando faço uma chamada webservice com um string de parâmetro, a chamada Object [] tmp = (Object []) classToQName.get (((Class) type).getName ()); retorna um vetor preenchido com algumas informações. Quando faço outra chamada com o byte[], o tmp volta null, portanto ele fica gravado como anyType.

Aí voltando ao SoapWriter método WriteProperty:

if (qName [3] != null)
		((Marshal) qName [3]).writeInstance (this, obj);
	    else if (obj instanceof KvmSerializable)
		writeObjectBody ((KvmSerializable) obj);
	    else if (obj instanceof Vector)
		writeVectorBody ((Vector) obj, type.elementType);
	    else
		throw new RuntimeException ("Cannot serialize: "+ obj);

Neste caso, quando é string cai no primeiro if, o qName[3] é do tipo DM... Quando é vetor de byte cai no throw.

Bom, eu não tenho ideia como solucionar este problema, e explicando dessa forma vejo que também fica muito difícil de entender. Mas de qualquer forma qualquer ajuda é super benvinda.

Há outra alternativa para a troca de objeto?

Criado 7 de maio de 2009
Ultima resposta 12 de mai. de 2009
Respostas 5
Participantes 2