[英]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.writeObject
( oos.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.