Frage

Ich habe den folgenden Code, der entweder einen Fehler oder ein Missverständnis von meiner Seite zeigt.

Ich habe die gleiche Liste, aber über einen Object geändert. Einmal als [0] und andere als [1]. Aber wenn ich es lese, bekomme ich [0] zweimal. Ich denke, dass dies durch die Tatsache verursacht wird, dass ich über das gleiche Objekt schicke und Object müssen sie irgendwie werden Caching.

Ist diese Arbeit, wie es sollte, oder sollte ich einen Bug-Datei?

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);
    }
}
War es hilfreich?

Lösung

Der Strom hat eine Referenzkurve, so dass ein Objekt, das zweimal gesendet wird, zwei Objekte am anderen Ende nicht geben, werden Sie nur einer. Und das gleiche Objekt zweimal gesendet getrennt werden Sie die gleiche Instanz zweimal (jeweils mit den gleichen Daten - das ist, was Sie sehen).

Sehen Sie die reset () Methode, wenn Sie die Grafik zurücksetzen möchten.

Andere Tipps

Max ist richtig, aber Sie können auch verwendet werden:

public void writeUnshared(Object obj);

Siehe unten für caveat Kommentar

Was möchten Sie wahrscheinlich ist:

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

Ansonsten wird dasselbe Objekt zweimal gespült werden, wenn der Strom geschlossen oder sein Puffer leer ist.

Just FYI, wenn Sie die Objekte in deserialisieren, sagen wir mal o1 und o2, o1 != o2.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top