Java liefert einen Mechanismus, der als Serialisierung bezeichnet wird.
Wenn wir ein Objekt serialisiert haben, kann es daher durch die Art des Objekts und andere Informationen gelesen und deaktiviert werden und schließlich den Prototyp des Objekts erhalten.
ObjectInputStream und ObjectOutputStream -Objekte sind hohe Streaming -Objekte, einschließlich der Serialisierung und der hinteren Methoden.
ObjectOutputStream verfügt über viele Methoden für serialisierte Objekte.
Private void writeObject (ObjectOutputStream OS) löst IOException {} aus
Ähnliches ObjectInputStream liefert die folgenden Methoden:
Private void Marke (ObjectInputStream) löst IOException, classNotFoundException {} aus
Wo muss es also serialisiert werden? Die Serialisierung verwendet normalerweise Netzwerkübertragungsdaten oder speichert Objekte in Dateien. Die hier genannten Daten sind ein Objekt und kein Text.
Das Problem ist nun, dass unsere Netzwerkarchitektur und unsere Festplatte nur binäre und Bytes identifizieren können und Java -Objekte nicht erkennen können.
Die Serialisierung soll Wert/Zustände im Java -Objekt in Bytes übersetzen, um über das Netzwerk zu übertragen oder zu speichern. Darüber hinaus besteht die Abhängigkeitserialisierung darin, den Byte -Code zu lesen und ihn wieder in das Java -Objekt zu übersetzen.
Serialversionuid -Konzept
Serialversionuid wird verwendet, um sicherzustellen, dass dasselbe Objekt (das in der Serialisierung verwendet werden kann) während des Deserialisierungsprozesses geladen werden kann. Serialversionuid ist eine Versionskontrolle für Objekte. Sie können sich auf Serialversionuid in der Java -Serialisierung beziehen, um weitere Informationen zu erhalten.
Für die Serialisierung:
Die Schritte sind wie folgt:
Lassen Sie uns eine Liste sehen:
Erstellen
1.Amployee.java
Paket org.arpit.javapostsforning; = Mitarbeiter;} public String GetOplopoPoToPoPoMame () {Return EmployeeName;} public void setOployeName (String EmployeeName) {this.EMPLYEENA ME = Employeename;} public String getDeppartment () {return Department;} public void SetDepment (String Department) {this this. Abteilung = Abteilung;}}
Wie Sie sehen können, müssen Sie die serialisierbare Schnittstelle implementieren, wenn Sie eine Klasse serialisieren müssen.
Die Markierungsschnittstelle in Java ist eine Schnittstelle ohne Feld oder Methode.
2.Serializemain.java
Paket org.arpit.javapostsforning; ] Args) {Employee Emp = New Employee (); Ser "); ObjectputStream outstream = new ObjectputStream (FileOut); outstream.writeObject (emp); outstream.close (); Ausnahme i) {i.printstacktrace ();}}}
Für die Rückseite -Sequenzierung:
Der Schritt ist
Erstellen Sie im Paket src-> org.arpit.javapostsforlearning Deserializemain.java
3.Deserializemain.java
Paket org.arpit.javapostsforning; Null; IoException i) {i.printstacktrace (); ... "); system.out.println (" EMP ID: " + emp.getOleMEID ()); System.out.println (" Name: " + emp.getOPPLENAME (); STEM.OUT.println (" Abteilung: " + emp.getDeppartment ());}}
4. Run:
Führen Sie zuerst die Serializemain.java aus und führen Sie dann die Deserializemain.java aus, Sie erhalten die folgenden Ergebnisse:
Deserialisierte Emblayee ... EMP ID: 101Name: ArpitDePapartment: CS
Auf diese Weise haben wir ein Mitarbeiterobjekt serialisiert und es dazu durchgeführt. Dies sieht einfach aus, aber wenn es Objektreferenzen und Vererbung enthält, wird die Situation kompliziert. Schauen wir uns die Beispiele nacheinander an, um zu sehen, wie die Serialisierung bei verschiedenen Gelegenheiten erreicht werden kann.
Fall 1 -Wenn das Objekt andere Objekte zitiert, was soll ich tun, was ich tun soll
Wir haben bereits die einfachsten Beispiele auf Sequenzbasis gesehen. Wie können wir serialisieren? Wird das zitierte Objekt auch serialisieren? Ja, Sie müssen nicht explizit serialisiert werden. Wenn Sie ein Objekt serialisieren und Referenzobjekte enthält, serialisiert die Java -Serialisierung das gesamte Objektdiagramm des Objekts automatisch. Zum Beispiel zitiert Mitarbeiter nun ein Adressobjekt und Adressierung auch andere Objekte (z Erstellen wir die Adressklasse und fügen Sie das Objekt der Adresse als Referenz hinzu, um sie der Mitarbeiterklasse hinzuzufügen.
Mitarbeiter.java:
Paket org.arpit.javapostsforning; This.EployeeId = EmployeeId;} public String getEypoPoPoPoPoPoPoPoPo -Employeename () {return EmployeeEename;} public void setEmpoloyeename (String Employeename) {this.emPlayeename = EmployeeEname;} Public String getDeppartment () {Return Department;} public void setDeppartMent (String) {{{{{{{{{{{{{{{{{{{{{{{ This.Department = Abteilung;} öffentliche Adresse getAddress () {Rückgabeadresse;} public void setAddress (Adressadresse) {this.address = Adresse;
Erstellen Sie in org.arpit.javapostsforlerning Paket address.java
Adresse.java:
Paket org.arpit.javapostsforning; Diese .City = City;} public int gethomeno () {return homeeno;} public void Sethomeno (int zu Hause) {this.homeno = homeeno;} public StringstStreet () {Street;} public void setstreet (String Street) {this. Street = Street;} public String getCity () {return city;} public void setCity (String City) {this.city = City;}}
Erstellen Sie in der org.arpit.javapostsforblegening eine serializedeserializemain.java
Serializedeserializemain.java:
Paket org.arpit.javapostsforning; Mandliya */ öffentliches statisches Void Main (String [] args) {Employee Emp = New Employee (); 88, "Mg Road", "Pune"); close ();} catch (ioException i) {i.printstacktrace ();} /Deserialize emp = l; (Mitarbeiter) in.ReamObject (); Deserialized Employee ... "); System .out.println (" EMP ID: " + emp.getOleMEID ()); System.out.println (" Name: " + emp.getOPPLEMAME (); mp.getDepartment () );
Führen Sie es aus:
Wenn Sie serializedeserializemain.java laufen. Sie erhalten ein solches Ergebnis:
java.io.notserializableException: org.arpit.javapostsforning.address at java.io.objectputtream.writeObject0 (unbekannte Quelle) bei Java.i O.ObjectputStream.defaultwritefields (Unbekannte Quelle) bei java.ioi. unter java.io.objectputStream.writeOrdinaryObject (unbekannte Quelle) unter java.io.objectputtream.writeObject0 (unbekannte Quelle) unter java.io.ob.ob.ob.
Wir werden erklären, wo es falsch ist. Ich habe vergessen zu sagen, dass die Adressklasse auch serialisierbar sein muss. Dann muss die Adressklasse die serialzierbare Schnittstelle erben.
Adresse.java:
Java.io.Serializable; .City = City;} public int gethomeno () {return homeeno;} public void sethomeno (int homeeno) {this.homeno = homeeno;} public stringstreet () {) return street;} public void setstreet (String Street) {this this .Street = street;} public String getCity () {return city;} public void setCity (String City) {this.city = City;}}}
Wieder laufen:
Wenn Sie wieder serializedeserializemain.java rennen. Sie können die folgenden Ergebnisse erzielen
Deserialisierte Emblayee ... EMP ID: 101Name: ArpitDepartment: Cscity: Pune
Fall 2: Wenn wir nicht auf den Quellcode des Referenzobjekts zugreifen können (z. B. können Sie nicht auf den Quellcode der oben genannten Adressklasse zugreifen).
Wenn wir nicht auf die Adressklasse zugreifen können, wie können wir dann die serialisierbare Schnittstelle in der Adressklasse implementieren? Gibt es eine andere Möglichkeit, dies zu erreichen? Ja, Sie können eine andere Klasse erstellen, die Adresse erben und dann die serialisierbare Schnittstelle erben lassen, aber für die folgende Situation schlägt diese Lösung fehl:
Wenn die Referenzklasse als das Finale definiert ist
Wenn die Referenzklasse auf ein anderes nicht -serialisiertes Objekt verweist
Wie können wir das Mitarbeiterobjekt serialisieren? Die Lösung besteht darin, den Übergang zu markieren. Wenn Sie kein Feld serialisieren müssen, markieren Sie es einfach als vorübergehend.
Übergangsadresse
Führen Sie in der Mitarbeiterklasse, nachdem die Adresse als vorübergehend markiert wurde, das Programm aus. Sie erhalten eine NullPointerexception, da die Adressreferenz während des Tiefenprozesses null ist.
Fall 3 -Was, wenn ich noch den Status des Referenzobjekts retten muss? (Zum Beispiel Adressobjekt)
Wenn Sie die Adresse während des tieferen Prozesses als transient gekennzeichnet haben, wird das Nullergebnis zurückgegeben. Wenn Sie jedoch noch seinen Zustand speichern müssen, müssen Sie das Adressobjekt serialisieren. Java -Serialisierung liefert einen Mechanismus.
Mitarbeiter.java:
Paket org.arpit.javapostsforning; Adresse; } Public String getDePapartment () {Rückgabeabteilung;} public void setDepartment (String -Abteilung)} öffentliche Adresse getadDress () {Rückgabeadresse;} public void setAddress (Adressadresse) {this.address = Adresse;} private void WriteObject (ObjectOutputStream Os) löscht ioException, classNotFoundException {try {os.DefaultwriteObject (); }} Private void readObject (ObjectInputStream) löst ioExcetion foundException {try {is.defaultReadObject (); .ReadObject ();
Eine andere Sache, die ObjectInputStream beachten sollte, liest die Reihenfolge der Daten von ObjectOutputStream.
Address.java erstellen
Adresse.java:
Paket org.arpit.javapostsforning; = Street; This.street = street;} public String getCity () {return city;} public void setCity (String City) {this.city = City;
Erstellen serializedeserializemain.java
Serializedeserializemain.java:
Paket org.arpit.javapostsforning; Mandliya */ öffentliches statisches Void Main (String [] args) {Employee Emp = New Employee (); 88, "Mg Road", "Pune"); close ();} catch (ioException i) {i.printstacktrace ();} /Deserialize emp = l; (Mitarbeiter) in.ReamObject (); Deserialized Employee ... "); System .out.println (" EMP ID: " + emp.getOleMEID ()); System.out.println (" Name: " + emp.getOPPLEMAME (); mp.getDepartment () );
laufen:
Wenn Sie serializedeserializemain.java ausführen.
Deserialisierte Emblayee ... EMP ID: 101Name: ArpitDepartment: Cscity: Pune
Jetzt erhalten wir den Zustand des Adressobjekts, genau wie es, bevor es serialisiert wird.
Vererbung in der Serialisierung:
Lassen Sie uns nun sehen, wie sich die Erbschaft auf die Serialisierung auswirkt. Unabhängig davon, ob die übergeordnete Klasse serialisiert ist, wird dies zu vielen Beispielen führen. Wenn die Elternklasse nicht serialisiert ist, was werden wir tun und wie sie funktioniert. Schauen wir uns das Beispiel an.
Wir werden eine Person.java als übergeordnete Klasse des Arbeitnehmers erstellen.
Fall 4: Wenn die übergeordnete Klasse serialisiert ist
Wenn die übergeordnete Klasse serialisieren kann, werden alle Vererbungsklassen serialisiert.
Fall 5: Was ist, wenn die übergeordnete Klasse nicht serialisiert ist?
Wenn die übergeordnete Klasse nicht -serialisiert ist, sind unsere Verarbeitungsmethoden sehr unterschiedlich.
Wenn die übergeordnete Klasse nicht -serialisiert ist, darf sie keine Parameterkonstruktorfunktion haben.
Person.java
Paket org.arpit.javapostsforning; Super (); ;} Public void setNationality (String Nationalität) {this.nationity = Nationalität;}}
Erstellen Sie Mitarbeiter.java
Mitarbeiter.java:
Paket org.arpit.javapostsforning; .AbineId = Mitarbeiter; Abteilung;} public void setdeppartment (String -Abteilung) {this.deppartment = Abteilung;}}
Erstellen serializedeserializemain.java
Serializedeserializemain.java:
Paket org.arpit.javapostsforning; Mandliya */public static void main (String [] args) {// serialize Employeee EMP = New Employee (101, "Arpit", "Indian"); .Println ("EMP ID:" + emp.getObleD ()); getDeppartment ()); ); ************* ");) ;; try {FileInputStream FileIn = new FileInputStream (" Employeee.ser ");) in.readObject (); in.close (); FileIn.close ()) } Catch (ioException i) {i.printstacktrace (); ("Nach Serialisierung"); "Abteilung:" + Emp.getdeppartment ());
laufen:
Wenn Sie die serializedeserializemain.java ausführen, erhalten Sie die folgende Ausgabe. Hier wird der Name persönlich geerbt, sodass der Name während des tieferen Tiefenprozesses auf den Standardwert initialisiert wird.
Fall 6 -Wenn die übergeordnete Klasse serialisiert ist, aber Sie müssen die Klasse nicht als serialisiert erben
Wenn Sie die Klasse nicht zur Serialisierung erben möchten, müssen Sie die Methoden writeObject () und readObject () implementieren und die Abnormalität der NotSerializableException wegwerfen.
Fall 7 -Die statischen Variablen serialisieren?
kann nicht. Da statische Variablen Klassenstufen sind, keine Objektniveaus.
Zusammenfassen: