繁体   English   中英

使用ReadObject和WriteObject进行自定义序列化

[英]Custom Serialization using ReadObject and WriteObject

我试图通过使用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;
    }   
}

这里发生的是'Employee'类是可序列化的。 并且你已经覆盖了writeObject方法。

现在,在这个overridden方法中,您将再次创建一个Employee对象的实例并调用oos writeObject方法。

序列化逻辑检查正在添加的对象是否可序列化。 如果是,则序列化它或者抛出NotSerializable异常。

这里,添加的对象是Serializable 因此,它将序列化它并发现此Object已重写writeObject方法。 所以它称之为方法。

现在再次进入重写的方法逻辑并再次执行相同的方法调用

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

并且循环继续,导致StackOverflow错误,因为它一遍又一遍地递归调用它而不会中断

这是因为您在Employee类中重写了writeObject方法。 因此,当您创建Employee对象并尝试使用writeObject方法编写它时,会以递归方式调用它,从而导致StackOverflow错误。

但是,当您不编写Employee对象时,代码会正确执行。

---根据评论中的澄清编辑

Employee类中,您将覆盖writeObject方法,因此,每当您尝试使用Employee作为参数调用ObjectOutputStream.writeObject时,将调用重写的方法。 现在在Employee类中重写的writeObject中,您再次使用Employee作为参数调用ObjectOutputStream.writeObjectoos.writeObject(emp); ),因此, Employee类的writeObject方法被递归调用( 每次都使用新的Employee对象 )并且您得到stackoverflow错误。

现在,如果您尝试以递归方式调用this关键字,则是因为您尝试使用相同的Employee类实例调用ObjectOutputStream.writeObject 根据下面提到的链接中的ObjectOutputStream.writeObject文档:

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

使用引用共享机制对对单个对象的多个引用进行编码,以便可以将对象图形恢复为与写入原始图像时相同的形状。

事实上,如果您在main方法中尝试以下代码:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM