Diciamo che avete queste due classi, Foo e Bar dove barra si estende Foo e realizza Serializable
Java serializzazione degli oggetti e l'eredità
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;
}
}
noti che Foo non implementa Serializable
. Quindi cosa succede quando la barra viene serializzata?
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);
}
stampa "Predefinito 21". La domanda è: perché il costruttore predefinito viene chiamato quando la classe non è serializzata?
Non è possibile creare improvvisamente istanze di una classe innocente senza chiamare il suo costruttore, quindi la specifica seriale richiede di chiamare un costruttore di classi non serializzabili./Potresti volere un proxy seriale. –