Пользовательская сериализация с использованием ReadObject и WriteObject

Я пытаюсь написать экземпляр класса pojo с помощью метода WriteObject. когда я пишу код, как это:

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

Он работает нормально, но когда я пытаюсь создать новый локальный объект и передать его в метод writeObject, он не работает с

Исключение в потоке "основной" java.lang.StackruError

Может кто-нибудь объяснить, почему он продолжает вызывать метод 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;
    }   
}

2 ответа

Здесь происходит то, что класс "Сотрудник" сериализуем. И ты переопределил writeObject метод в этом.

Сейчас в этом overridden метод, вы снова создаете экземпляр Employee объект и вызов writeObject метод oos,

Логика сериализации проверяет, является ли добавляемый объект сериализуемым. Если это так, то сериализовать его или иначе бросить NotSerializable исключение.

Здесь добавляемый объект Serializable, Следовательно он идет сериализовать его и обнаружил, что это Object имеет writeObject метод переопределен. Так что это вызывает этот метод.

Теперь снова он переходит к вашей переопределенной логике метода и снова вызывает тот же метод

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

и петли продолжаются, что приводит к Stackru ошибка, так как он вызывает его снова и снова, не ломая

Это из-за того, что вы переопределяете writeObject метод в вашем Employee учебный класс. Итак, когда вы создаете Employee объект и попробуйте написать его с помощью writeObject метод, он называется рекурсивно, приводя к Stackru ошибка.

Но когда ты не пишешь Employee Объект код выполняется правильно.

--- Редактировать согласно уточнению, заданному в комментарии

В вашем Employee класс, вы переопределяете writeObject метод, поэтому всякий раз, когда вы пытаетесь вызвать ObjectOutputStream.writeObject с Employee в качестве параметра будет вызван ваш переопределенный метод. Теперь в вашем переопределении writeObject в Employee класс, ты снова звонишь ObjectOutputStream.writeObject(oos.writeObject(emp);) с Employee в качестве параметра, таким образом, writeObject метод Employee Класс вызывается рекурсивно (каждый раз с новым объектом Employee), и вы получаете ошибку stackru.

Теперь в случае, когда вы пытаетесь вызвать рекурсивно this ключевое слово, это из-за того, что вы пытаетесь вызвать ObjectOutputStream.writeObject с тем же экземпляром Employee учебный класс. В соответствии с ObjectOutputStream.writeObject документация по указанной ниже ссылке:

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

Несколько ссылок на один объект кодируются с использованием механизма совместного использования ссылок, так что графики объектов могут быть восстановлены в той же форме, что и при написании оригинала.

Infact, если вы попробуете приведенный ниже код в вашем основном методе:

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

т.е. если вы вызываете writeObject несколько раз для одного и того же объекта, он вызывается только один раз.

Другие вопросы по тегам