Comment fonctionne la sérialisation quand seulement la sous-classe implémente sérialisable
Seulement sous-classe a mis en œuvre Serializable
interface.
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 seule chose, j'ai remarqué, ici, c'est classe parent n'est pas sérialisé. Alors, pourquoi ne pas jeter NotSerializableException
en effet, c'est en montrant suivantes
Sortie
Serial 20
Serial 10
Également, la sortie diffèrent de Serialization
et De-serialization
. Je viens seulement de savoir, c'est à cause de la classe parent n'a pas mis en œuvre Serializable
. Mais, Si quelqu'un m'expliquer, ce qui se passe durant l'objet de la sérialisation et la désérialisation. Comment elle change la valeur ? Je ne suis pas en mesure de comprendre, j'ai aussi utilisé commentaire dans mon programme. Donc, si je me trompe, à tout moment, s'il vous plaît laissez-moi savoir.
source d'informationauteur Ravi
Vous devez vous connecter pour publier un commentaire.
selon la Serializable javadoc
aussi, la sérialisation d'exception n'est levée si la classe d'être sérialisé n'est pas sérialisable. non sérialisable parents est très bien (tant qu'ils ont un no-arg constructeur). Objet lui-même n'est pas Sérialisable, et tout ce qui l'étend.
la citation ci-dessus explique aussi pourquoi vous obtenez différentes valeurs pour le champ de valeur - la-arg constructeur de la classe parent est définie, qui définit la valeur du champ-10 - le domaine appartient à la (non sérialisable) parent afin que sa valeur n'est pas écrit/lu à partir du flux.
Si votre MyClass contient la référence à un objet de la non classe sérialisable, vous obtiendrez NotSerializable exception au moment de l'exécution. Pour tester, modifier MyClass de sorte qu'il contient une référence à un objet de NewClass1. Si vous exécutez à nouveau, il va lever une exception.
La désérialisation est essentiellement la création d'une instance d'une classe sérialisable et la restauration de ses propriétés. Au cours de ce processus, le constructeur de la classe sérialisable n'est pas appelé. Plutôt la non arg constructeur de premier non sérialisable super classe est appelée.
Dans votre cas, le pas de arg constructeur de NewClass1 affecte 10 à sa variable d'instance-je. Ainsi, lors de la désérialisation, c'est l'impression de 10 au lieu de 20.
Je n'ai pas testé, mais d'obtenir un
NotSerializableException
si la sérialisation de l'instance de la classe de base. C'est le même lorsque votre classe contient certains membres qui ne sont pasSerializable
.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 voulez.