Senden des gleichen, aber modifizierten Objekts über ObjectOutputStream

Lesezeit: 1 Minute

Senden des gleichen aber modifizierten Objekts uber ObjectOutputStream
Pyrolistisch

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

Ich habe dieselbe Liste gesendet, aber über einen ObjectOutputStream geändert. Einmal als [0] und andere als [1]. Aber wenn ich es lese, bekomme ich es [0] zweimal. Ich denke, das liegt daran, dass ich dasselbe Objekt sende und ObjectOutputStream sie irgendwie zwischenspeichern muss.

Funktioniert das so, wie es sollte, oder sollte ich einen Fehler melden?

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

Der Stream hat einen Referenzgraphen, sodass ein zweimal gesendetes Objekt nicht zwei Objekte am anderen Ende liefert, sondern nur eines. Und wenn Sie dasselbe Objekt zweimal separat senden, erhalten Sie zweimal dieselbe Instanz (jeweils mit denselben Daten – was Sie sehen).

Sehen Sie sich die Methode reset() an, wenn Sie das Diagramm zurücksetzen möchten.

Senden des gleichen aber modifizierten Objekts uber ObjectOutputStream
Pyrolistisch

Max ist richtig, aber Sie können auch verwenden:

public void writeUnshared(Object obj);

Siehe Kommentar unten für Vorbehalt

  • Das funktioniert in diesem Fall, führt aber im Allgemeinen zu wirklich seltsamen Fehlern. Jedes geschriebene Komponentenobjekt wird weiterhin gemeinsam genutzt. Wenn also beispielsweise die obige Liste mit Collections.synchronizedList umschlossen wäre, würde das Problem bestehen bleiben. writeUnshared ist nicht sehr nützlich.

    – Tom Hawtin – Angelleine

    27. September 2008 um 14:15 Uhr

.

516610cookie-checkSenden des gleichen, aber modifizierten Objekts über ObjectOutputStream

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy