Пользовательская сериализация с использованием 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
несколько раз для одного и того же объекта, он вызывается только один раз.