Wie die Serialisierung funktioniert, wenn nur Unterklasse implementiert serializable
Nur Unterklasse implementiert hat Serializable
- Schnittstelle.
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);
}
}
}
Eine Sache, die ich bemerkt, hier ist die übergeordnete Klasse nicht serialisiert. Dann, warum hat er dann nicht werfen NotSerializableException
es tatsächlich ist, zeigen folgende
Ausgabe
Serial 20
Serial 10
Ebenfalls, Ausgabe unterscheiden sich von Serialization
und De-serialization
. Ich einfach nur wissen, es ist, weil der parent-Klasse nicht implementiert hat Serializable
. Aber, Wenn jemand mir erklären, was passiert, während der Objekt-Serialisierung und de-Serialisierung. Wie verändert es den Wert ? Ich bin nicht in der Lage, herauszufinden, auch die, die ich verwendet haben, Kommentar in meinem Programm. Also, wenn ich falsch bin, an jedem Punkt, lassen Sie es mich bitte wissen.
InformationsquelleAutor der Frage Ravi | 2012-12-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
entsprechend der Serializable javadoc
auch, Serialisierung exception wird nur geworfen, wenn die Klasse serialisiert wird, ist nicht serialisierbar. mit nicht-serialisierbaren Eltern ist in Ordnung (solange Sie haben einen no-arg-Konstruktor). Objekt selbst ist nicht Serialisierbar, und alles, was reicht es.
das obige Zitat erklärt auch, warum erhalten Sie unterschiedliche Werte für das Feld Wert ein - die no-arg-Konstruktor der übergeordneten Klasse festgelegt ist, legt das Wert-Feld 10 - Feld gehört zu den (nicht-serialisierbar) Eltern-also Ihren Wert nicht geschrieben/aus dem stream gelesen.
InformationsquelleAutor der Antwort radai
Wenn Ihr MyClass hält Referenz auf ein Objekt nicht serialisierbar Klasse erhalten Sie NotSerializable Ausnahme zur Laufzeit. Um zu testen, ändern MyClass so, dass es hält eine Referenz auf ein Objekt der NewClass1. Wenn Sie erneut ausführen, wird eine Ausnahme geworfen.
Deserialisierung ist im wesentlichen die Schaffung einer Instanz einer serialisierbaren Klasse und die Wiederherstellung seiner Eigenschaften. Während dieses Prozesses wird der Konstruktor der serializable-Klasse wird nicht aufgerufen. Eher die no-arg-Konstruktor der ersten nicht serialisierbaren Superklasse aufgerufen wird.
In Ihrem Fall die no-arg-Konstruktor der NewClass1 weist 10 auf die instance-variable "i". So, während der Deserialisierung es drucken 10 statt 20.
InformationsquelleAutor der Antwort Sandeep Panda
Ich habe es nicht getestet, aber du bekommst eine
NotSerializableException
wenn der Serialisierung der Instanz der Basis-Klasse. Es ist das gleiche, wenn die Klasse enthält einige Elemente, die nichtSerializable
.Bedeutet, wenn Sie ein Objekt erstellen
NewClass1 nc1 = new NewClass1();
und versuchen zu serialisieren der obj-nc1, erhalten Sie die Ausnahme, die Sie wollen.InformationsquelleAutor der Antwort PC.