Pessoal, estou com um problemão aqui que não consigo resolver.
Fucei no GUJ sobre o assunto “serialização” e desta forma consegui fazer o que eu precisava: serializar objetos.
Ok! Só que agora tenho um problema: as vezes funciona e as vezes dá erro! Isso mesmo gente! Só as vezes e não consigo entender o que pode fazer o erro acontecer nesses casos! Já revirei todos os exemplos possíveis daqui do GUJ e não consigo encontrar qual possa ser o problema. Vou explicar a situação:
De um lado tenho um Server que recebe um pedido do Client, processa e pode dar a resposta de duas formas: ou um objeto String ou um objeto X que eu tenho aqui.
Meu objeto X é um objeto que tem apenas atributos de tipo String, cerca de 20 atributos, todos do tipo String.
Abaixo o código de onde faço a serialização desse objeto pra enviá-lo:
[code]Object obj = TrataPacote(alguns parâmetros); // retorna um Object que é ou uma String ou um X
ObjectOutputStream objOutputStream = new ObjectOutputStream(meuSocket.getOutputStream());
if (obj instanceof X)
objOutputStream.writeObject((X)obj);
else
objOutputStream.writeObject((String)obj);
objOutputStream.flush();
objOutputStream.close();[/code]
Do outro lado tenho o Client que enviou o pedido pro Server e agora está esperando a serialização desse Object como resposta.
Abaixo o código de onde recebo o objeto serializado:
try {
ObjectInputStream objInputStream = new ObjectInputStream(meuSocket.getInputStream());
Object resposta = objInputStream.readObject(); //aqui
objInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
Bom, o Server e o Client estão rodando na mesma máquina, em duas janelas diferentes. Eu abro o Server primeiro, depois o Client. Se eu mantiver o Server aberto e for abrindo e fechando o Client pra testar, as vezes chega o objeto correto, as vezes não. Extremamente aleatório! Sempre que ocorrer do retorno ser String, funciona. Quando é o caso de retornar o objeto X (a maioria das vezes), ocorre esta situação aleatória que mencionei de as vezes chegar certo as vezes não.
Quando não dá certo ele entra no meu “catch” e imprime a Exception abaixo:
[color=red]java.io.StreamCorruptedException: illegal handle value
at java.io.ObjectInputStream.readHandle(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at minhaClasse:linha[/color]
A linha apontada pela Exception é a que está marcada com o //aqui no código do Client.
A sensação que tenho é de que “as vezes” o objeto chega corrompido, ou talvez o Client comece a ler antes do Server terminar de enviar, não sei, algo assim. Mas pq “as vezes”? Seria isso msm que estou suspeitando?! Como resolver?!?!?!
Por favor, alguma luz pessoal?!?!?