Envoi du même objet mais modifié par ObjectOutputStream
-
02-07-2019 - |
Question
Le code suivant indique un bogue ou un malentendu de ma part.
J'ai envoyé la même liste, mais modifiée via un ObjectOutputStream. Une fois comme [0] et autre comme [1]. Mais quand je le lis, je reçois deux fois [0]. Je pense que cela est dû au fait que j'envoie le même objet et que ObjectOutputStream doit les mettre en cache d'une manière ou d'une autre.
Ce travail est-il comme il se doit ou dois-je enregistrer un bogue?
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); } }
La solution
Le flux a un graphe de référence, donc un objet qui est envoyé deux fois ne donnera pas deux objets à l’autre bout, vous n’en obtiendrez qu’un. Et envoyer le même objet deux fois séparément vous donnera la même instance deux fois (chacune avec les mêmes données - c'est ce que vous voyez).
Voir la méthode reset () si vous souhaitez réinitialiser le graphique.
Autres conseils
Max est correct, mais vous pouvez également utiliser:
public void writeUnshared(Object obj);
Voir le commentaire ci-dessous pour l'avertissement
Ce que vous voulez probablement, c'est:
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);
Sinon, le même objet sera vidé deux fois lorsque le flux est fermé ou que sa mémoire tampon est épuisée.
Just FYI, lorsque vous désérialisez les objets dans, disons o1
et o2
, o1! = o2
.