niquement la sous-classe a implémenté l'interface Serializable
.
import Java.io.*;
public class NewClass1{
private int i;
NewClass1(){
i=10;
}
int getVal() {
return i;
}
void setVal(int i) {
this.i=i;
}
}
class MyClass extends NewClass1 implements Serializable{
private String s;
private NewClass1 n;
MyClass(String s) {
this.s = s;
setVal(20);
}
public String toString() {
return s + " " + getVal();
}
public static void main(String args[]) {
MyClass m = new MyClass("Serial");
try {
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("serial.txt"));
oos.writeObject(m); //writing current state
oos.flush();
oos.close();
System.out.print(m); // display current state object value
} catch (IOException e) {
System.out.print(e);
}
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("serial.txt"));
MyClass o = (MyClass) ois.readObject(); // reading saved object
ois.close();
System.out.print(o); // display saved object state
} catch (Exception e) {
System.out.print(e);
}
}
}
Une chose, que j'ai remarquée ici, c'est que la classe parent n'est pas sérialisée. Alors, pourquoi n'a-t-il pas lancé NotSerializableException
en effet, il montre ce qui suit
Sortie
Serial 20
Serial 10
De plus, la sortie diffère de Serialization
et De-serialization
. Je sais juste que c'est parce que la classe parent n'a pas implémenté Serializable
. Mais, si quelqu'un m'explique, que se passe-t-il pendant la sérialisation et la désérialisation des objets. Comment cela change-t-il la valeur? Je ne suis pas en mesure de comprendre, j'ai également utilisé des commentaires dans mon programme. Donc, si je me trompe à tout moment, faites-le moi savoir.
selon le javadoc sérialisable
Pendant la désérialisation, les champs des classes non sérialisables seront initialisés à l'aide du constructeur public ou protégé sans argument de la classe. Un constructeur sans argument doit être accessible à la sous-classe sérialisable. Les champs des sous-classes sérialisables seront restaurés à partir du flux.
également, l'exception de sérialisation n'est levée que si la classe en cours de sérialisation n'est pas sérialisable. avoir des parents non sérialisables est très bien (tant qu'ils ont un constructeur sans argument). L'objet lui-même n'est pas sérialisable, et tout le prolonge. la citation ci-dessus explique également pourquoi vous obtenez des valeurs différentes pour le champ de valeur - le constructeur sans argument pour la classe parent est défini, ce qui définit le champ de valeur à 10 - le champ appartient au parent (non sérialisable), donc sa valeur n'est pas écrit/lu dans le flux.
Si votre MyClass contient une référence à un objet de classe non sérialisable, vous obtiendrez une exception NotSerializable au moment de l'exécution. Pour tester, modifiez MyClass afin qu'il contienne une référence à un objet de NewClass1. Si vous exécutez à nouveau, il lèvera une exception.
La désérialisation consiste essentiellement à créer une instance d'une classe sérialisable et à restaurer ses propriétés. Au cours de ce processus, le constructeur de la classe sérialisable n'est pas appelé. On appelle plutôt le constructeur no arg de la première super classe non sérialisable.
Dans votre cas, le constructeur no arg de NewClass1 affecte 10 à sa variable d'instance i. Ainsi, pendant la désérialisation, il imprime 10 au lieu de 20.
Je ne l'ai pas testé, mais vous obtiendrez un NotSerializableException
si vous sérialisez l'instance de la classe de base. Il en est de même lorsque votre classe contient des membres qui ne sont pas Serializable
.
Signifie que si vous créez un objet NewClass1 nc1 = new NewClass1();
et essayez de sérialiser l'obj nc1, vous obtiendrez l'exception que vous souhaitez.