Invio dello stesso object ma modificato su ObjectOutputStream

Ho il seguente codice che mostra un bug o un malinteso da parte mia.

Ho inviato la stessa lista, ma modificata su un ObjectOutputStream. Una volta come [0] e altri come [1]. Ma quando lo leggo, ottengo [0] due volte. Penso che questo sia causato dal fatto che sto inviando lo stesso object e ObjectOutputStream deve essere memorizzato nella cache in qualche modo.

Funziona come dovrebbe, o dovrei presentare un bug?

 import java.io. *;  importa java.net. *;  import java.util. *;  public class OOS {public static void main (String [] args) genera 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 ());  // output [0] come previsto System.out.println (ois.readObject ());  // output [0], ma previsto [1] System.out.println (ois.readObject ());  System.exit (0);  }} 

Lo stream ha un grafico di riferimento, quindi un object che viene inviato due volte non darà due oggetti sull’altra estremità, ne otterrai solo uno. E inviando lo stesso object due volte separatamente, otterrai la stessa istanza due volte (ognuno con gli stessi dati – che è ciò che stai vedendo).

Vedere il metodo reset () se si desidera ripristinare il grafico.

Max è corretto, ma puoi anche usare:

public void writeUnshared(Object obj); 

Vedi il commento qui sotto per avvertimento

Quello che probabilmente vuoi è:

 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); 

In caso contrario, lo stesso object verrà svuotato due volte quando il stream viene chiuso o il buffer si esaurisce.

Solo FYI, quando deserializzi gli oggetti, diciamo o1 e o2 , o1 != o2 .