使用 ReadObject 和 WriteObject 的自定义序列化
Custom Serialization using ReadObject and WriteObject
我正在尝试使用 WriteObject 方法编写 pojo class 的实例。当我写这样的代码时:
private void writeObject(ObjectOutputStream oos) throws IOException,ClassNotFoundException{
oos.defaultWriteObject();
oos.writeObject(this);
}
它工作正常,但是当我尝试创建一个新的本地对象并将其传递给 writeObject 方法时,它失败并显示
Exception in thread "main" java.lang.WhosebugError
有人可以解释一下为什么它一直递归地一次又一次地调用 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' class 是可序列化的。你已经覆盖了其中的 writeObject
方法。
现在,在此 overridden
方法中,您将再次创建 Employee
对象的实例并调用 oos
的 writeObject
方法。
序列化逻辑检查正在添加的对象是否可序列化。如果是,则将其序列化,否则抛出 NotSerializable
异常。
这里,添加的对象是Serializable
。因此它去序列化它并发现这个 Object
有 writeObject
方法被覆盖。所以它调用那个方法。
现在它再次转到您覆盖的方法逻辑并再次调用相同的方法
oos.defaultWriteObject();
Employee emp = new Employee("sumit",10);
oos.writeObject(emp);
循环继续,导致 Whosebug
错误,因为它一遍又一遍地递归调用它而没有中断
这是因为您在 Employee
class 中覆盖了 writeObject
方法。因此,当您创建 Employee
对象并尝试使用 writeObject
方法编写它时,它会被递归调用,从而导致 Whosebug
错误。
但是,当您不编写 Employee
对象时,代码会正确执行。
---根据评论中要求的说明进行编辑
在您的 Employee
class 中,您正在覆盖 writeObject
方法,因此,无论何时,您尝试使用 Employee
作为参数调用 ObjectOutputStream.writeObject
,您重写的方法将被调用。
现在,在 Employee
class 中覆盖的 writeObject
中,您再次调用 ObjectOutputStream.writeObject
( oos.writeObject(emp);
) 并将 Employee 作为参数,因此,writeObject
方法Employee
class 的 class 被递归调用( 每次都使用新的 Employee 对象 )并且你得到 Whosebug 错误。
现在,如果您尝试递归调用 this
关键字,那是因为您尝试使用 Employee
[=59] 的相同实例调用 ObjectOutputStream.writeObject
=].根据下面提到的 ObjectOutputStream.writeObject
文档 link :
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
,它只会被调用一次。
我正在尝试使用 WriteObject 方法编写 pojo class 的实例。当我写这样的代码时:
private void writeObject(ObjectOutputStream oos) throws IOException,ClassNotFoundException{
oos.defaultWriteObject();
oos.writeObject(this);
}
它工作正常,但是当我尝试创建一个新的本地对象并将其传递给 writeObject 方法时,它失败并显示
Exception in thread "main" java.lang.WhosebugError
有人可以解释一下为什么它一直递归地一次又一次地调用 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' class 是可序列化的。你已经覆盖了其中的 writeObject
方法。
现在,在此 overridden
方法中,您将再次创建 Employee
对象的实例并调用 oos
的 writeObject
方法。
序列化逻辑检查正在添加的对象是否可序列化。如果是,则将其序列化,否则抛出 NotSerializable
异常。
这里,添加的对象是Serializable
。因此它去序列化它并发现这个 Object
有 writeObject
方法被覆盖。所以它调用那个方法。
现在它再次转到您覆盖的方法逻辑并再次调用相同的方法
oos.defaultWriteObject();
Employee emp = new Employee("sumit",10);
oos.writeObject(emp);
循环继续,导致 Whosebug
错误,因为它一遍又一遍地递归调用它而没有中断
这是因为您在 Employee
class 中覆盖了 writeObject
方法。因此,当您创建 Employee
对象并尝试使用 writeObject
方法编写它时,它会被递归调用,从而导致 Whosebug
错误。
但是,当您不编写 Employee
对象时,代码会正确执行。
---根据评论中要求的说明进行编辑
在您的 Employee
class 中,您正在覆盖 writeObject
方法,因此,无论何时,您尝试使用 Employee
作为参数调用 ObjectOutputStream.writeObject
,您重写的方法将被调用。
现在,在 Employee
class 中覆盖的 writeObject
中,您再次调用 ObjectOutputStream.writeObject
( oos.writeObject(emp);
) 并将 Employee 作为参数,因此,writeObject
方法Employee
class 的 class 被递归调用( 每次都使用新的 Employee 对象 )并且你得到 Whosebug 错误。
现在,如果您尝试递归调用 this
关键字,那是因为您尝试使用 Employee
[=59] 的相同实例调用 ObjectOutputStream.writeObject
=].根据下面提到的 ObjectOutputStream.writeObject
文档 link :
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
,它只会被调用一次。