Pergunta

Eu tenho o seguinte código que mostra tanto um bug ou um mal-entendido da minha parte.

Eu enviei a mesma lista, mas modificada ao longo de um ObjectOutputStream. Uma vez que como [0] e a outra como [1]. Mas quando eu lê-lo, eu recebo [0] duas vezes. Eu acho que isso é causado pelo fato de que estou enviando em relação ao mesmo objeto e ObjectOutputStream deve ser cache-los de alguma forma.

É este trabalho como deveria, ou devo registrar um bug?

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

Solução

O fluxo tem um gráfico de referência, de modo que um objeto que é enviado duas vezes não vai dar dois objetos na outra extremidade, você só vai ter um. E enviar o mesmo objeto duas vezes separadamente lhe dará a mesma instância duas vezes (cada um com os mesmos dados - que é o que você está vendo)

.

Veja o método reset () se você deseja redefinir o gráfico.

Outras dicas

Max é correto, mas você também pode usar:

public void writeUnshared(Object obj);

Veja comentário abaixo para ressalva

O que você provavelmente quer é:

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

Caso contrário, o mesmo objecto vai ser lavada duas vezes quando o fluxo está fechado ou o seu tamp de se esgote.

Apenas FYI, quando você desserializar os objetos em, digamos o1 e o2, o1 != o2.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top