java - 使用 ReadObject 和 WriteObject 的自定义序列化

标签 java serialization java-custom-serialization

我正在尝试使用 WriteObject 方法编写 pojo 类的实例。当我写这样的代码时:

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

它工作正常但是当我尝试创建一个新的本地对象并将它传递给 writeObject 方法时它失败了

Exception in thread "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 方法。因此,当您创建 Employee 对象并尝试使用 writeObject 方法写入它时,它会被递归调用,从而导致 StackOverflow 错误。

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

---根据评论中要求的说明进行编辑

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

如果您尝试递归调用 this 关键字,那是因为您尝试使用 的相同实例调用 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,它只会被调用一次。

关于java - 使用 ReadObject 和 WriteObject 的自定义序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51979123/

相关文章:

java - 使用 SwingFXUtils 将 BufferedImage(awt) 转换为 Image(JavaFx)

java - 什么声明将下面的循环变成无限循环?

java - 如何使用特定注释将自定义序列化器设置为任意 API 端点(spring 应用程序)?

java - 使用 spring-data-redis 在 redis 中存储原始 json

java - 自定义 BeanPropertyFilter - 仅序列化字符串的一部分

java - 创建 IO 流对象

java - 获取应用程序图标时,MainActivity 类型未定义 getContext() 方法

使用 JPA 和 Rest API 进行 Java 序列化

c++ - 使用 XML 宽存档 boost juce::String 的反序列化问题