public class Solution implements Serializable {
String Name;
public Solution(String Name) throws FileNotFoundException {
this.Name = Name;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
System.out.println("just a line");
out.flush();
}
public static void main(String[] args) throws Exception {
File file = File.createTempFile("test", null);
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
Solution solution = new Solution("test");
out.writeObject(solution);
out.close();
ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
Solution loaded = (Solution) in.readObject();
}
}
Кто может объяснить, почему мы переписываем методы readObject/writeObject для нашего кастомного класса, но вызываем эти методы по прежнему у объектов ObjectInputStream/ObjectOutputStream, как логика переписанных методов передается в методы другого класса?
Пример, переписываем writeObject для класса Solution:
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
System.out.println("just a line");
out.flush();
}
Потом просто сериализируем вызывая writeObject, но НЕ объекта класса Solution, а у объекта ObjectOutputStream
out.writeObject(solution);
После чего объект solution будет записан, а в консоль выведется строка "just a line". Как так выходит? Правильно ли я понимаю, что в глубинах реализации метода writeObject класса ObjectOutputStream идет проверка на то, что writeObject переписан у объекта, который передают, и в случае совпадения, выполняется дальше наш переписанный writeObject. Хотя там идет вызов defaultWriteObject(), который снова отдает выполнение методу writeObject класса ObjectOutputStream, аааааааа, мозг плавиться, помогите)))