(java) ObjectInputStream desserializando a versão incorreta do objeto [duplicate]
Esta pergunta já tem uma resposta aqui:
Soquete / serialização Java, o objeto não é atualizado 2 respostasEstou apenas aprendendo a trabalhar em rede a partir de um livro em java, então sou meio noob. Não encontrei esse problema no livro ou on-line, então decidi perguntar pela internet.
O livro diz para usar o ObjectOutputStream e ObjectInputStream para enviar e receber objetos para diferentes console
Agora, sou capaz de receber com êxito os objetos que envio - mas apenas uma vez. Quando envio objetos diferentes: seqüências aleatórias e Inteiros e instâncias sem nome, o console possui todos os campos corretos. Mas quando envio uma instância de um objeto, altero o valor de um dos campos da instância e reenvio o objeto, e o inpustream carrega os valores da instância origina
Então, digamos, por exemplo, eu tive uma instância de uma classe com um público int "var" igual a 1. Se eu enviar a instância dessa classe, o cliente a recebe e informa corretamente que var = 1. No entanto, se eu altere var para 2 (na mesma instância) e reenvie-o, o cliente terminará de chamar o método read () (portanto, ele deve ter recebido o novo objeto!), mas relatará var como sendo 1. Se eu enviar a instância para um cliente diferente que ainda não recebeu a instância, ela reportará corretamente var como 2 e continuará relatando como 2, mesmo se eu alterar var.
O fato de o cliente ler a versão correta da instância, caso não a tenha recebido antes, significa que o objeto está sendo enviado corretamente pelo fluxo de saída; por alguma razão, o fluxo de entrada simplesmente não está funcionando. É quase como se ele visse que é o mesmo objeto e, portanto, assume que possui os mesmos valores sem verificar. Por que isso acontece e como posso corrigi-lo?
Desculpe se estou perguntando algo estúpido - o livro não explica como a serialização e os soquetes funcionam, apenas como usá-los, então eu poderia muito bem estar fundamentalmente confuso sobre como usá-los. Obrigado
ódigo simples que escrevi para testar o problem
Server: (possui uma ação de timer para continuar enviando objetos atualizados)
public void actionPerformed(ActionEvent e)
{
object.var++;
output.write(object);
output.flush();
System.out.println(object.var);
}
Client
public void run()
{
while(true)
{
Test t = (Test)input.readObject();
System.out.println(t.var);
}
}
Quando esses programas executam a saída para a classe Server é 1,2,3,4 ... aumentando infinitamente, enquanto a saída do Cliente é apenas 1,1,1,1,1,1,1, etc.
Obrigado por separar um tempo para ler isso. Desculpe se estou apenas sendo burro, sou novo nessas coisas.
EDIT: Desculpe, o read () era um erro de digitação (digitei manualmente o código porque não consegui fazer a formatação correta), quis dizer input.readObject ()