Serialização personalizado usando ReadObject e WriteObject

Por Kumar:

Eu estou tentando escrever uma instância da classe pojo usando o método WriteObject. Quando eu escrevo um código como este:

    private void writeObject(ObjectOutputStream oos) throws IOException,ClassNotFoundException{ 
    oos.defaultWriteObject();    
    oos.writeObject(this);
}

Ele funciona bem, mas quando eu tento e criar um novo objeto local e passá-lo para o método writeObject ele falha com

Exception in thread "main" java.lang.StackOverflowError

pode alguém por favor explicar por que ele continua chamando o método writeObject novamente e novamente de forma recursiva?

class Employee implements Serializable{
    private String name;
    private int age;
    private void readObject(ObjectInputStream ois) throws IOException,ClassNotFoundException{
        ois.defaultReadObject();
        Employee emp = (Employee)ois.readObject();
        emp.toString();
    }
    private void writeObject(ObjectOutputStream oos) throws IOException,ClassNotFoundException{
        oos.defaultWriteObject();
        Employee emp = new Employee("sumit",10);
        oos.writeObject(emp);
    }
    public Employee(){

    }
    public Employee(String name, int age){
        this.name = name;
        this.age = age;
    }   
}
codeLover:

É por causa do fato de que você está substituindo writeObjectmétodo em sua Employeeclasse. Então, quando você cria o Employeeobjeto e tentar escrevê-lo usando writeObjectmétodo, ele é chamado recursivamente levando a StackOverflowerro.

Mas, quando você não escreve Employeeobjeto as executa o código corretamente.

--- Editar conforme o esclarecimento solicitado no comentário

Em sua Employeeclasse, você está substituindo o writeObjectmétodo, assim, sempre, tentar invocar ObjectOutputStream.writeObjectcom Employeecomo parâmetro, o seu método substituído será invocado. Agora em sua substituído writeObjectna Employeeclasse, você está novamente chamando ObjectOutputStream.writeObject( oos.writeObject(emp);) com empregado como parâmetro, portanto, writeObjectmétodo de Employeeclasse fica recursivamente chamada ( com o novo toda vez objeto Employee ) e você terá stackoverflow erro.

Agora, no caso quando você tentar chamar recursivamente thispalavra-chave, é por causa do fato de que você tentar invocar ObjectOutputStream.writeObjectcom a mesma instância de Employeeclasse. De acordo com a ObjectOutputStream.writeObjectdocumentação no link abaixo mencionados:

https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

Várias referências a um único objecto são codificadas usando um mecanismo de partilha de referência, de modo que os gráficos de objectos pode ser restaurada para a mesma forma que quando o original foi escrita.

De fato, se você tentar o código abaixo em seu método principal:

Employee emp = new Employee("sumit",10);
oos.writeObject(emp);
oos.writeObject(emp);

ou seja, se você invocar writeObjectvárias vezes no mesmo objeto, ele é invocado apenas uma vez.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=221234&siteId=1
Recomendado
Clasificación