1) зачем сериализовать Solution, если нам нужно сериализовать только объект класса B?
2) Если не объявлен конструктор, обяъявляется конструктор по умолчанию. Не понимаю, зачем его явно объявлять здесь, если это делает джава?
3) Вычитал, что если объявить в каком-то классе именно эти методы с именно этими сигнатурами и модификатором доступа, то они вызываются самостоятельно.
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(nameA);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
nameA = (String) in.readObject();
}
А) Но что происходит в момент их вызова? Откуда берутся потоки ObjectInputStream и ObjectOutputStream, если я их не создавал и не передавал в метод?
B) Код в методах, как понял, даёт инструкцию, как именно сохранять и восстанавливать объект (что-то типа Formattera). Но как, где и когда он потом достаётся / присваивается. Или строка 19 вызывает автоматом строку 50, а 24 вызывает 55-ую и тогда получается что-то типа "кудазаписать.чтосделать(счемсделать) каксделать" или как это вообще работает?
package com.javarush.task.task20.task2018;
import java.io.*;
/*
Найти ошибки
*/
public class Solution implements Serializable {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(arrayOutputStream);
Solution solution = new Solution();
B b = solution.new B("B2", "C33");
System.out.println("nameA: " + b.nameA + ", nameB: " + b.nameB);
oos.writeObject(b);
ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(arrayOutputStream.toByteArray());
ObjectInputStream ois = new ObjectInputStream(arrayInputStream);
B b1 = (B) ois.readObject();
System.out.println("nameA: " + b1.nameA + ", nameB: " + b1.nameB);
}
public static class A {
protected String nameA = "A";
public A() {
}
public A(String nameA) {
this.nameA += nameA;
}
}
public class B extends A implements Serializable {
private String nameB;
public B(String nameA, String nameB) {
super(nameA);
this.nameA += nameA;
this.nameB = nameB;
}
private void writeObject(ObjectOutputStream out) throws IOException {
out.defaultWriteObject();
out.writeObject(nameA);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
in.defaultReadObject();
nameA = (String) in.readObject();
}
}
}