Web services x JME x Serialização

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.

[up] post editado, nova pergunta adicionada

[quote=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.
[/quote]

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…

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

[code] 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();
}

[/code]

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

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.

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

na classe SoapWriter tem a seguinte chamada:

Agora veja o ClassMap , método getInfo:

[code] 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};
}

[/code]

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?