Pregunta

Tengo el siguiente código que muestra un error o un malentendido de mi parte.

Envié la misma lista, pero modifiqué sobre un ObjectOutputStream. Una vez como [0] y otra como [1]. Pero cuando lo leo, obtengo [0] dos veces. Creo que esto se debe al hecho de que estoy enviando el mismo objeto y ObjectOutputStream debe almacenarlos en caché de alguna manera.

¿Funciona como debería o debo presentar un error?

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);
    }
}
¿Fue útil?

Solución

El flujo tiene un gráfico de referencia, por lo que un objeto que se envía dos veces no dará dos objetos en el otro extremo, solo obtendrá uno. Y enviar el mismo objeto dos veces por separado le dará la misma instancia dos veces (cada una con la misma información, que es lo que está viendo).

Consulte el método de restablecimiento () si desea restablecer el gráfico.

Otros consejos

Max es correcto, pero también puedes usar:

public void writeUnshared(Object obj);

Ver comentario a continuación para advertir

Lo que probablemente quieras es:

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

De lo contrario, el mismo objeto se vaciará dos veces cuando la secuencia se cierre o se agote su búfer.

Solo para tu información, cuando deserialices los objetos, digamos o1 y o2 , o1! = o2 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top