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;
}
}
É por causa do fato de que você está substituindo writeObject
método em sua Employee
classe. Então, quando você cria o Employee
objeto e tentar escrevê-lo usando writeObject
método, ele é chamado recursivamente levando a StackOverflow
erro.
Mas, quando você não escreve Employee
objeto as executa o código corretamente.
--- Editar conforme o esclarecimento solicitado no comentário
Em sua Employee
classe, você está substituindo o writeObject
método, assim, sempre, tentar invocar ObjectOutputStream.writeObject
com Employee
como parâmetro, o seu método substituído será invocado. Agora em sua substituído writeObject
na Employee
classe, você está novamente chamando ObjectOutputStream.writeObject
( oos.writeObject(emp);
) com empregado como parâmetro, portanto, writeObject
método de Employee
classe fica recursivamente chamada ( com o novo toda vez objeto Employee ) e você terá stackoverflow erro.
Agora, no caso quando você tentar chamar recursivamente this
palavra-chave, é por causa do fato de que você tentar invocar ObjectOutputStream.writeObject
com a mesma instância de Employee
classe. De acordo com a ObjectOutputStream.writeObject
documentaçã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 writeObject
várias vezes no mesmo objeto, ele é invocado apenas uma vez.