Enviando el mismo objeto pero modificado sobre ObjectOutputStream
-
02-07-2019 - |
Pregunta
Tengo el siguiente código que muestra un error o un malentendido de mi parte.
Envié la misma lista, pero modifiqué sobre un ObjectOutputStream. Una vez como [0] y otra como [1]. Pero cuando lo leo, obtengo [0] dos veces. Creo que esto se debe al hecho de que estoy enviando el mismo objeto y ObjectOutputStream debe almacenarlos en caché de alguna manera.
¿Funciona como debería o debo presentar un error?
import java.io.*; import java.net.*; import java.util.*; public class OOS { public static void main(String[] args) throws Exception { Thread t1 = new Thread(new Runnable() { public void run() { try { ServerSocket ss = new ServerSocket(12344); Socket s= ss.accept(); ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream()); List same = new ArrayList(); same.add(0); oos.writeObject(same); same.clear(); same.add(1); oos.writeObject(same); } catch(Exception e) { e.printStackTrace(); } } }); t1.start(); Socket s = new Socket("localhost", 12344); ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); // outputs [0] as expected System.out.println(ois.readObject()); // outputs [0], but expected [1] System.out.println(ois.readObject()); System.exit(0); } }
Solución
El flujo tiene un gráfico de referencia, por lo que un objeto que se envía dos veces no dará dos objetos en el otro extremo, solo obtendrá uno. Y enviar el mismo objeto dos veces por separado le dará la misma instancia dos veces (cada una con la misma información, que es lo que está viendo).
Consulte el método de restablecimiento () si desea restablecer el gráfico.
Otros consejos
Max es correcto, pero también puedes usar:
public void writeUnshared(Object obj);
Ver comentario a continuación para advertir
Lo que probablemente quieras es:
ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
List same = new ArrayList();
same.add(0);
oos.writeObject(same);
oos.flush(); // flush the stream here
same.clear();
same.add(1);
oos.writeObject(same);
De lo contrario, el mismo objeto se vaciará dos veces cuando la secuencia se cierre o se agote su búfer.
Solo para tu información, cuando deserialices los objetos, digamos o1
y o2
, o1! = o2
.