Когда нужно использовать конструктор без аргументов при сериализации?
Не могу нагуглить ответ. Смысл в том, что иногда попытка сериализовать объект требует наличия пустого конструктора (а если его нет - выбрасывает исключение). Хочу разобраться, когда нужны эти конструкторы, и зачем. Пример задачи:
import java.io.*;
public class Solution implements Serializable {
public static class A {
protected String nameA = "A";
public A(String nameA) {
this.nameA += nameA;
}
public A() { // пустой бессмысленный конструктор? Зачем?
}
}
public class B extends A implements Serializable {
public B() { // тот же вопрос
}
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.writeObject(nameA);
out.defaultWriteObject();
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
nameA = (String) in.readObject();
in.defaultReadObject();
}
}
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);
}
}
Ответы (1 шт):
Пустой конструктор необходим для восстановления объекта. Всякий раз когда вы определяете хотя бы один конструктор с параметрами (т.е. по дефолту не создается пустой конструктор.
Это позволяет восстанавливать сериализованный объект из потока, т.е. начать не дожидаясь получения всего объекта. Сериализованный объект начинается с описания класса. Читается описание и создается пустой объект. Для этого класс и должен иметь пустой конструктор. Потом идут параметры, если есть. Они последовательно читаются и вставляются в созданный объект (через сеттеры, ведь наверное речь идет о javabean).
Вторая причина - при сериализации пустые параметры (параметр = null) просто не пишутся в поток, т.е. минимизируется размер сериализованного обьекта.