Enviando o mesmo, mas modifed objeto sobre ObjectOutputStream
-
02-07-2019 - |
Pergunta
Eu tenho o seguinte código que mostra tanto um bug ou um mal-entendido da minha parte.
Eu enviei a mesma lista, mas modificada ao longo de um ObjectOutputStream. Uma vez que como [0] e a outra como [1]. Mas quando eu lê-lo, eu recebo [0] duas vezes. Eu acho que isso é causado pelo fato de que estou enviando em relação ao mesmo objeto e ObjectOutputStream deve ser cache-los de alguma forma.
É este trabalho como deveria, ou devo registrar um bug?
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); } }
Solução
O fluxo tem um gráfico de referência, de modo que um objeto que é enviado duas vezes não vai dar dois objetos na outra extremidade, você só vai ter um. E enviar o mesmo objeto duas vezes separadamente lhe dará a mesma instância duas vezes (cada um com os mesmos dados - que é o que você está vendo)
.Veja o método reset () se você deseja redefinir o gráfico.
Outras dicas
Max é correto, mas você também pode usar:
public void writeUnshared(Object obj);
Veja comentário abaixo para ressalva
O que você provavelmente quer é:
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);
Caso contrário, o mesmo objecto vai ser lavada duas vezes quando o fluxo está fechado ou o seu tamp de se esgote.
Apenas FYI, quando você desserializar os objetos em, digamos o1
e o2
, o1 != o2
.