Załóżmy, że masz te dwie klasy Foo i bar, gdzie Foo Bar rozszerza i wdraża Serializable
serializacji obiektu Java i dziedziczenie
class Foo {
public String name;
public Foo() {
this.name = "Default";
}
public Foo(String name) {
this.name = name;
}
}
class Bar extends Foo implements java.io.Serializable {
public int id;
public Bar(String name, int id) {
super(name);
this.id = id;
}
}
Zauważ, że Foo nie wykona Serializable
. Co się dzieje, gdy pasek jest serializowany?
public static void main(String[] args) throws Exception {
FileOutputStream fStream=new FileOutputStream("objects.dat");
ObjectOutputStream oStream=new ObjectOutputStream(fStream);
Bar bar=new Bar("myName",21);
oStream.writeObject(bar);
FileInputStream ifstream = new FileInputStream("objects.dat");
ObjectInputStream istream = new ObjectInputStream(ifstream);
Bar bar1 = (Bar) istream.readObject();
System.out.println(bar1.name + " " + bar1.id);
}
wyświetla "Domyślnie 21". Pytanie brzmi, dlaczego domyślny konstruktor jest wywoływany, gdy klasa nie jest serializowana?
Nie można nagle utworzyć instancji niewinnej klasy bez wywoływania jej konstruktora, więc specyfikacja szeregowa wymaga wywołania konstruktora klas, które nie mogą być szeregowane./Możesz chcieć seryjnego proxy. –