Foros del Web » Programación para mayores de 30 ;) » Java »

Serializacion

Estas en el tema de Serializacion en el foro de Java en Foros del Web. Hola, les hago la siguiente consulta. Estoy probando una aplicacion cliente-servidor de chat, para mantener los usuarios conectados utilizo un vector, el tema es el ...
  #1 (permalink)  
Antiguo 23/10/2006, 06:43
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
Exclamación Serializacion

Hola, les hago la siguiente consulta.

Estoy probando una aplicacion cliente-servidor de chat, para mantener los usuarios conectados utilizo un vector, el tema es el siguiente: he notado que cada vez que un nuevo usuario se conecta, y envio el vector de conectados al cliente recien conectado, este muestra todos los clientes de forma correcta, pero cuando lo hago sobre un cliente que ya estaba conectado, este no recibe el vector en la forma correcta, es decir, no ve los cambios hechos por el servidor al vector, la adición de un nuevo cliente. El problema lo he solucionado clonando el vector antes de enviarlo.

Sin importar que esto sea ineficiente, lo que me interesa es solucionar este problema sin recurrir a la clonacion de objetos, aunque despues lo que haga solo sea enviar la clase cliente (recien conectado) al resto de los clientes de mi chat.

Gracias
  #2 (permalink)  
Antiguo 23/10/2006, 08:26
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Al hacer serializacion estas enviando una copia, asi que el problema debe estar antes de enviar el vector, en el servidor, o en el cliente al deserializar lo recibido.
Pero el proceso de serializar en si envia una copia, asi que no es por ahi.
  #3 (permalink)  
Antiguo 23/10/2006, 08:47
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
El vector es un vector de clientes (Clase cliente que implementa Serializable). Yo creo que el problema es que el vector no se deserializa porque en escencia es el mismo. Al clonarlo, cambia y se reflajan los cambios.

No hay errores antes de enviar el vector, lo imprimo por consola y lo veo, y en los restantes clientes que ya estan conectados, los cambios no surgen efecto, pero en los clientes recien conectados esta perfecto.
  #4 (permalink)  
Antiguo 23/10/2006, 09:58
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 7 meses
Puntos: 454
Hola:

Efectivamente, hay un problema de ese estilo si usas un ObjectOutputStream o algo parecido. Estas clases recuerdan qué han enviado y no se preocupan en serializarlo por segunda vez si envías lo mismo, aunque internamente haya cambiado.

Una solución sin clonar es llamar al método reset() del ObjectOutputStream antes de enviar algo. En su día me tropecé con este problema haciendo un programa de enviar ficheros. En el enlace puedes ver las posibles soluciones.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 23/10/2006, 14:10
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Exactamente, eso es así si el usas el mismo ObjectOutputStream para enviar varias veces el mismo objeto, lo cual no se si es lo que él hace o no. De hecho, es totalmente lógico que si serializas dos veces el mismo objeto en un mismo ObjectOutputStream, al leerlo te devuelva dos veces el mismo objeto (la implementacion lo que hace es enviar la segunda vez un puntero al primer objeto, no el objeto entero), por que si no al leerlo tendrías dos copias del mismo objeto... supuestamente el mismo objeto... pero con campos diferentes...¿??¿

Según el API, si queremos evitar eso y al escribir dos veces el mismo objeto queremos que no haga caso del estado que tenia antes, tenemos el metodo reset().

De todas formas... ¿como envias los objetos a los clientes? ¿RMI? ¿JMS? ¿Sockets a pelo?
  #6 (permalink)  
Antiguo 30/10/2006, 05:33
Avatar de pyanqn  
Fecha de Ingreso: noviembre-2005
Mensajes: 331
Antigüedad: 18 años, 5 meses
Puntos: 8
Utilizo sockets y nada mas.
  #7 (permalink)  
Antiguo 30/10/2006, 06:40
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Entonces si mantienes abierto el socket durante toda la comunicación, cuando vuelvas a enviar objetos serializados por el mismo SocketOutputStream, entonces no te los enviará nuevos, si no solo un puntero al anterior. Para evitarlo tendrás que usar un reset() sobre el ObjectOutputStream cuando actualices datos.

Suerte

Para algo así, ¿no te has planteado usar JMS para que la comunicación sea asincrona y el servidor no tenga que recorrer la lista de clientes y enviarle a cada uno la misma actualización?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:17.