我试图使用writeobject方法编写pojo类的实例。当我写这样的代码时:

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

它工作得很好,但是当我尝试创建一个新的本地对象并将其传递给writeobject方法时,它失败了
线程“main”java.lang.StackOverflowerRor中出现异常
有人能解释一下为什么它不断地递归地调用writeobject方法吗?
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;
    }
}

最佳答案

这是因为您正在重写writeObject类中的Employee方法。因此,当您创建Employee对象并尝试使用writeObject方法编写它时,会递归地调用它,从而导致StackOverflow错误。
但是,如果不编写Employee对象,则代码将正确执行。
——根据评论中的澄清进行编辑
在您的Employee类中,您正在重写writeObject方法,因此,每当您尝试使用ObjectOutputStream.writeObject作为参数调用Employee时,都将调用您的重写方法。
现在在writeObject类中重写的Employee中,您再次以employee作为参数调用ObjectOutputStream.writeObjectoos.writeObject(emp);),因此,writeObject类的Employee方法将被递归调用(每次都使用新的employee对象),并且您将得到stackoverflow错误。
现在,当您尝试递归调用this关键字时,这是因为您尝试使用同一个ObjectOutputStream.writeObject类实例调用Employee。根据以下链接的ObjectOutputStream.writeObject文档:
https://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html
使用引用共享机制对单个对象的多个引用进行编码,以便可以将对象的图形还原为与写入原始对象时相同的形状。
实际上,如果您在主方法中尝试以下代码:

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

即,如果对同一对象多次调用writeObject,则只调用一次。

08-07 00:27