Estoy aprendiendo redes de un libro java, así que soy un poco novato. No pude encontrar este problema en el libro o en línea, así que decidí preguntar en Internet.(java) ObjectInputStream deserialización de la versión incorrecta del objeto
El libro dice que use ObjectOutputStream y ObjectInputStream para enviar y recibir objetos a diferentes consolas.
Ahora, puedo recibir con éxito los objetos que envío, pero solo una vez. Cuando envío diferentes objetos: cadenas aleatorias, enteros e instancias sin nombre, la consola tiene todos los campos correctos. Pero cuando envío una instancia de un objeto, cambie el valor de uno de los campos de la instancia y vuelva a enviar el objeto, luego inpustream carga los valores de la instancia original.
Así que, por ejemplo, tengo una instancia de una clase con una int pública "var" igual a 1. Si envío la instancia de esta clase, el cliente la recibe e informa correctamente que var = 1. Sin embargo , si cambio var a 2 (en la misma instancia) y lo vuelvo a enviar, el cliente terminará llamando al método read() (¡así que debe haber recibido el nuevo objeto!), pero informará que var es 1. Si envíe la instancia a un cliente diferente que aún no haya recibido la instancia, informará correctamente var como 2 y continuará informándola como 2 incluso si cambio var.
El hecho de que el cliente lea la versión correcta de la instancia si no la ha recibido antes debe significar que el objeto se envía correctamente a través de la salida de salida; por alguna razón el inputstream simplemente no está funcionando. Es casi como si ve que es el mismo objeto, por lo que supone que tiene los mismos valores sin verificar. ¿Por qué sucede esto y cómo puedo solucionarlo?
Lo siento si estoy preguntando algo estúpido: el libro no explica cómo funcionan la serialización y los zócalos, simplemente cómo usarlos, por lo que podría estar muy confundido acerca de cómo usarlos. ¡Gracias!
código simple que escribí para probar el problema:
Servidor: (tiene una acción del temporizador para mantener el envío de objetos actualizados)
public void actionPerformed(ActionEvent e)
{
object.var++;
output.write(object);
output.flush();
System.out.println(object.var);
}
cliente
public void run()
{
while(true)
{
Test t = (Test)input.readObject();
System.out.println(t.var);
}
}
Cuando estos programas se ejecutan la salida para la clase Servidor es 1,2,3,4 ... aumentando infinitamente, mientras que la salida del Cliente es solo 1,1,1,1,1,1,1, etc.
Gracias por tomarse el tiempo para leer esto. Lo siento si solo soy tonto, soy nuevo en esto.
EDITAR: Lo sentimos, los read() era un mistype (i manualmente tecleé el código porque no podía EGET el formato correcto), me refería a input.readObject()
Pregunta relacionada: http://stackoverflow.com/questions/15675262/. –