Zunächst muss ich erklären, was Serialisierung ist.
Serialisierung ermöglicht es, ein Objekt in einen Stream zu konvertieren, um dieses Objekt über das Netzwerk zu senden ODER in eine Datei zu speichern ODER in der DB für die Briefverwendung zu speichern.
Es gibt einige Regeln für die Serialisierung .
-
Ein Objekt ist nur serialisierbar, wenn seine Klasse oder seine Oberklasse die Schnittstelle Serializable implementiert
-
Ein Objekt ist serialisierbar (implementiert selbst die Schnittstelle Serializable), auch wenn seine Oberklasse dies nicht ist. Die erste Oberklasse in der Hierarchie der serialisierbaren Klasse, die die Schnittstelle Serializable nicht implementiert, MUSS jedoch einen No-Arg-Konstruktor haben. Wenn dies nicht der Fall ist, erzeugt readObject() zur Laufzeit eine java.io.InvalidClassException
-
Alle primitiven Typen sind serialisierbar.
-
Transiente Felder (mit transientem Modifikator) werden NICHT serialisiert (d. h. nicht gespeichert oder wiederhergestellt). Eine Klasse, die Serializable implementiert, muss transiente Felder von Klassen markieren, die keine Serialisierung unterstützen (z. B. ein Dateistrom).
-
Statische Felder (mit statischem Modifikator) werden nicht serialisiert.
Wenn Object
serialisiert wird, assoziiert Java Runtime die serielle Versionsnummer, auch bekannt als die serialVersionID
.
Wo wir serialVersionID benötigen:
Während der Deserialisierung, um zu prüfen, ob Sender und Empfänger in Bezug auf die Serialisierung kompatibel sind. Wenn der Empfänger die Klasse mit einer anderen serialVersionID
dann wird die Deserialisierung mit InvalidClassCastException
.
Eine serialisierbare Klasse kann ihre eigene serialVersionUID
explizit durch Deklaration eines Feldes namens serialVersionUID
die statisch, endgültig und vom Typ long sein müssen.
Versuchen wir dies anhand eines Beispiels.
import java.io.Serializable;
public class Employee implements Serializable {
private static final long serialVersionUID = 1L;
private String empname;
private byte empage;
public String getEmpName() {
return name;
}
public void setEmpName(String empname) {
this.empname = empname;
}
public byte getEmpAge() {
return empage;
}
public void setEmpAge(byte empage) {
this.empage = empage;
}
public String whoIsThis() {
return getEmpName() + " is " + getEmpAge() + "years old";
}
}
Serialisierungsobjekt erstellen
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class Writer {
public static void main(String[] args) throws IOException {
Employee employee = new Employee();
employee.setEmpName("Jagdish");
employee.setEmpAge((byte) 30);
FileOutputStream fout = new
FileOutputStream("/users/Jagdish.vala/employee.obj");
ObjectOutputStream oos = new ObjectOutputStream(fout);
oos.writeObject(employee);
oos.close();
System.out.println("Process complete");
}
}
Das Objekt deserialisieren
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
public class Reader {
public static void main(String[] args) throws ClassNotFoundException, IOException {
Employee employee = new Employee();
FileInputStream fin = new FileInputStream("/users/Jagdish.vala/employee.obj");
ObjectInputStream ois = new ObjectInputStream(fin);
employee = (Employee) ois.readObject();
ois.close();
System.out.println(employee.whoIsThis());
}
}
HINWEIS: Ändern Sie nun die serialVersionUID der Klasse Employee und speichern Sie:
private static final long serialVersionUID = 4L;
Und führen Sie die Klasse Reader aus. Wenn Sie die Writer-Klasse nicht ausführen, erhalten Sie die Ausnahme.
Exception in thread "main" java.io.InvalidClassException:
com.jagdish.vala.java.serialVersion.Employee; local class incompatible:
stream classdesc serialVersionUID = 1, local class serialVersionUID = 4
at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:616)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1623)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at com.krishantha.sample.java.serialVersion.Reader.main(Reader.java:14)
7 Stimmen
Finden Sie eine gute Praxis über serialversionUID; dzone.com/articles/what-is-serialversionuid