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);
    }
}
Était-ce utile?

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 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top