Serijalizacija u je važan koncept koji se bavi pretvaranjem objekata u bajtni tok za transport java objekata s jednog Java virtualnog stroja na drugi i ponovno stvaranje u izvornom obliku. Dokument za ovaj članak poredat ću na sljedeći način:
- Što je serializacija u Javi?
- Zašto nam je potrebna serializacija u Javi?
- Kako serializirati objekt?
- Prednosti i nedostaci serializacije u Javi
- Praktični primjeri serializacije u Javi
- Eksternalizirano sučelje
- Prolazna ključna riječ
- UID serijske verzije
- Kontroverze serializacije u Javi
- Najbolji postupci tijekom korištenja serializacije u Javi
Što je serializacija u Javi?
Serijalizacija u Javi je postupak pretvorbe Java koda Objekt u a Byte stream , za prijenos objektnog koda s jednog Java virtualnog stroja na drugi i ponovno stvaranje pomoću procesa Deserijalizacija.
Zašto nam je potrebna serializacija na Javi ?
Serijalizacija nam je potrebna iz sljedećih razloga:
Komunikacija : Serijalizacija uključuje postupak objekta serializacija i prijenos. To omogućuje više računalnih sustava da istovremeno projektiraju, dijele i izvršavaju objekte.
Predmemoriranje : Vrijeme utrošeno za izgradnju objekta više je u usporedbi s vremenom potrebnim za njegovu uklanjanje serializacije. Serijalizacija minimalizira potrošnju vremena za predmemoriranje divovske predmete.
Duboka kopija : Kloniranje postupak je jednostavan pomoću serializacije. Točno replika predmeta dobiva se pomoćuserializiranjem predmeta na a bajtni niz , a zatim je povukao iz serializacije.
Križ JVM sinkronizacija: Glavna prednost serializacije je u tome štoradi na različitim JVM-ovima koji se možda izvode na različitim arhitekture ili Operativni sustavi
Upornost: Stanje bilo kojeg objekta može se izravno pohraniti primjenom serializacije i pohraniti u baza podataka tako da može biti preuzet kasnije.
Kako serializirati objekt?
DO Java objekt je serializirati ako i samo ako njegova klasa ili bilo koja roditeljska klasa implementira bilo Java . Ja . Serijalizirati sučelje ili njegovo podsučelje, java.io.Externalizable.
U procesu serializacije pretvaramo stanje objekta u bajtni tok kako bi se mogao prenijeti iz jednog JVM-a u drugi i vratiti bajtni tok natrag u izvorni objekt.
//Sučelje
paket Serial1 import java.io.Serializable public class Employee implementira Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id Ime niza public Employee (int id, String name) {this.id = id this.name = name }}
// Serijalizirati
paket Serial1 import java.io. * class Persist {public static void main (String args []) {try {Employee emp1 = new Employee (20110, 'John') Employee emp2 = new Employee (22110, 'Jerry') Employee emp3 = novi zaposlenik (20120, 'Sam') FileOutputStream fout = new FileOutputStream ('output.txt') ObjectOutputStream out = new ObjectOutputStream (fout) out.writeObject (emp1) out.writeObject (emp2) out.writeObject (emp3) out. flush () out.close () System.out.println ('Serijalizacija i deserijalizacija uspješno su izvršene')} catch (Iznimka e) {System.out.println (e)}}}
Izlaz:
Serijalizacija i deserijalizacija uspješno su izvršeni
Deserijalizacija : To je obrnuti postupak serializacije gdje se serijski tok bajtova objekta od pošiljatelja ponovno kreira na primajućem kraju.
// Deserialise
paket Serial1 import java.io. * class Depersist {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Employee e1 = (Employee) in.readObject ( ) Zaposlenik e2 = (Zaposlenik) in.readObject () Zaposlenik e3 = (Zaposlenik) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.name) System.out.println (e3.id + '' + e3.name) in.close ()} catch (Iznimka e) {System.out.println (e)}}}
Izlaz:
python pretvoriti decimalni u binarni
20110 Ivan
22110 Jerry
20120 Sam
Prednosti i nedostaci serializacije u Javi
Prednosti:
- Postupak serializacije je ugrađeni značajka koja ne zahtijeva softver treće strane za izvršavanje serializacije
Dokazano je da je postupak serializacije jednostavan i lako razumjeti
Postupak serializacije je univerzalni i programeri iz različitih pozadina su mu poznati
Jednostavan je za upotrebu i jednostavan za prilagodbu
Serijalizirani tokovi podataka podrška šifriranje, kompresija, autentifikacija i sigurno Java računalstvo
Mnogo ih je kritične tehnologije oslanjajući se na serializaciju.
Mane:
Objekti dok DeSerializacija postaje krhka i nisu sigurni da će biti učinkovito deserijalizirani.
Privremene varijable deklarirane dok serializacija stvara memorijski prostor, ali konstruktor se ne poziva što rezultira neuspjehom u inicijalizaciji prijelaznih varijabli što rezultira varijacija Standardnog Java toka.
Proces serializacije je neučinkovit u smislu iskorištenja memorije.
Serijalizacija nije poželjnija za upotrebu u aplikacijama koje trebaju istodobni pristup bez zahtjeva za API-ji treće strane , jer serializacija ne nudi mehanizam kontrole prijelaza po svakom SE.
Postupak serializacije ne nudi se sitnozrnata kontrola za pristup Objektima.
Praktični primjeri serializacije u Javi
Serijalizacija pomoću nasljeđivanja
Slučaj - 1: Ako je Superclass moguće serializirati, tada su, prema zadanim postavkama, njegove podrazrede također moguće serializirati.
U ovom slučaju, podrazred je serijski podrazumijevano ako je superrazred provodi Serijalizirano sučelje
paket SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable class A implementira Serializable {int i public A (int i) {this.i = i}} klasa B proširuje A {int j public B (int i, int j) {super (i) this.j = j}} test javne klase {public static void main (String [] args) baca iznimku {B b1 = novi B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = novi FileOutputStream ('abc.ser') ObjectOutputStream oos = novi ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt je serializiran') FileInputStream fis = novi FileInputStream ('abc.ser') ObjectInputStream ois = novi ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objekt je deserijaliziran') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}
Izlaz:
j = 20
Predmet je serializiran
Objekt je deserijaliziran
i = 200
j = 400
Slučaj - 2: Podrazred se može serializirati ako implementira serizirano sučelje, čak i ako superrazred ne implementira serializabilno sučelje.
U ovom slučaju, ako je superrazred ne provodi Serijalizirano sučelje , zatim, objekti podrazred može se ručno serializirati primjenom serirabilnog sučelja u potklasu.
paket SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.ObjectInputStream import java.io.ObjectOutputStream import java.io.Serializable superclass class {int i public superclass (int i) {this.i = i} javna superklasa () {i = 50 System.out.println ('Konstruktor superklase nazvan')}} klasa podrazred proširuje superklasu implementira Serializable {int j javna podklasa (int i, int j) {super (i) this.j = j }} javna klasa test2 {javna statička void glavna (String [] args) baca izuzetak {podrazred b1 = novi podrazred (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = novi FileOutputStream ('output.ser') ObjectOutputStream oos = novi ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt je serializiran') FileInputStream fis = novi FileInputStream ('output.ser') ObjectInputStream ois = novi ObjectInputStream (fis) podrazred b2 = (podrazred) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objekt je deserijaliziran') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}
Predmet je serializiran
Nazvan konstruktor superklase
Objekt je deserijaliziran
i = 50
j = 20
Slučaj - 3: Ako je superrazred moguće serializirati, ali ne trebamo serijski podrazred.
U tom se slučaju može spriječiti serializacija potklaseprimjenom writeObject () i readObject () metode u podrazredu i treba ga baciti NotSerializableException iz ovih metoda.
paket SerializationInheritance import java.io.FileInputStream import java.io.FileOutputStream import java.io.IOException import java.io.NotSerializableException import java.io.ObjectInputStream import java.io.ObjectOutputStreamliza java.iorent Parent.program Integracija java.iorent Parent. i public Parent (int i) {this.i = i}} klasa dijete produžuje Parent {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) baca IOException {throw new NotSerializableException ()} private void readObject (ObjectInputStream in) baca IOException {throw new NotSerializableException ()}} public class test3 {public static void main (String [] args) baca iznimku {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = new FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt je serializiran ') FileInputStream fis = novi FileInputStream (' abc.ser ') ObjectInputStream ois = novi ObjectInputStream (fis) dijete b2 = (dijete) ois.readObject () ois.close () fis.close () System.out. println ('Objekt je deserijaliziran') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}
Izlaz:
i = 100
j = 200
Iznimka u niti 'main' java.io.NotSerializableException
na SerializationInheritance.child.writeObject (test3.java:48)
na sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
Serijalizacija pomoću statičkog člana
Serijalizacija polja statičnog člana zanemaruje se u procesu serializacije. Serijalizacija jepovezane s najnovijim stanjem objekta. Stoga su samo podaci povezani s određenom instancom klaseserializirano, ali ne i polje statičkog člana.
paket stati import java.io. * klasa StaticSerial implementira Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('U vrijeme serializacije, statički član ima vrijednost: '+ i) probajte {FileOutputStream fos = new FileOutputStream (' F: File.ser ') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (ob) oos.close () i = 99 FileInputStream fis = new FileInputStream ('F: File.ser') ObjectInputStream ois = new ObjectInputStream (fis) ob = (StaticSerial) ois.readObject () ois.close () System.out.println ('Nakon deserijalizacije statični član ima vrijednost:' + i)} catch (Iznimka e) {System.out.println (e)}}}
Izlaz:
U vrijeme serializacije statički član ima vrijednost: 100
Nakon deserijalizacije, statički član ima vrijednost: 99
Eksternalizirano sučelje
The Eksternalizirano sučelje u Javi sličan je serializaciji, ali jedina je razlika u tome što je sposoban ponuditi prilagođena serializacija gdje možete odlučiti o objektima koji će se razmrviti u potoku.
Sučelje za eksternalizaciju dostupno je u java.io i pruža dvije metode:
- public void writeExternal (ObjectOutput out) baca IOException
- javna praznina readExternal (ObjectInput in) baca IOException
Ključne razlike između serializacije i eksternalizacije su sljedeće:
Provedba : Eksternalizirano sučelje izuzima korisnika u eksplicitno spomenuti predmete koji će se serijalizirati. Dok su u sučelju za serializaciju, svi su objekti i varijable serializirani u vrijeme izvođenja.
Metode : Eksternalizirano sučelje sastoji se od dvije metode, i to:
writeExternal ()
readExternal ()
Dok sučelje za seriranje ne uključuje nikakve metode.
Postupak: Postupak serializacije u eksternaliziranom sučelju pruža prilagođavanje na postupak serializacije. Ali, sučelje za serializaciju pružit će zadano postupak serializacije.
Povratna kompatabilnost i kontrola: Eksternalizirano sučelje podržava serializaciju bez obzira na kontrola verzija a jedini problem je što korisnik mora biti odgovoran tijekom serializacije Super Class-a. S druge strane, sučelje za serializaciju zahtijeva ista verzija JVM-ova na oba kraja, ali uključuje automatsku serializaciju svih objekata i klasa, uključujući superklasu.
Javni konstruktor bez argumenata: Potrebe sučelja za eksternalizaciju Javni konstruktor bez argumenata za rekonstrukciju serializiranog objekta. Iako sučelje za serializaciju ne zahtijeva No-Arg Constructor, umjesto toga koristi odraz za rekonstrukciju serializiranog objekta ili klase.
paket ext import java.io. * class Demo implementira java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} Test klase {public static void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (datoteka) out .writeObject (object) out.close () file.close () System.out.println ('Objekt je serializiran')} catch (IOException ex) {System.out.println ('IOException is caught')} Demo object1 = null try {FileInputStream file = new FileInputStream (filename) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Objekt je deserializirano ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException is catch ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException je uhvaćen')}}}
Prolazna ključna riječ
Privremena ključna riječ je rezervirana ključna riječ na Javi. Koristi se kao varijabla modify u vrijeme procesa serializacije. Deklariranje varijable s ključnom riječi Transient izbjegava serializaciju varijable.
UID serijske verzije
Prije nego započne postupak serializacije, svaka klasa / objekt koji se može serializirati poveže se s jedinstveni identifikacijski broj pruža JVM glavnog računala. Poziva se ovaj Jedinstveni ID UID serijske verzije . Ovaj UID koristi se kao identifikacija od strane JVM-a primajućeg kraja kako bi se potvrdilo da se isti objekt DeSerializira na prihvatnom kraju.
Kontroverze serializacije u Javi
Oracleova Arhitekti namjeravaju ukloniti serializaciju s Jave kako je smatraju Užasna greška iz 1997 . Nakon užurbanog istraživanja, programeri u Oracleu otkrili su nekoliko nedostataka u dizajnu postupka serializacije koji predstavljaju prijetnju podacima.
1997. god.Mark Reinhold kaže - “ Serijalizaciju volimo nazivati 'darom koji nastavlja davati', a vrsta dara koji daje je sigurnosne ranjivosti. Vjerojatno je trećina svih Java ranjivosti uključena u serializaciju, što bi moglo biti više od polovice. To je zapanjujuće plodan izvor ranjivosti, a da ne spominjemo nestabilnosti. '.
Postoje šanse da bi se serijalizacija uklonila ili zamijenila u nadolazećim ažuriranjima Jave, a s druge strane, za početnike u Javi, serializacija ne mogu biti idealistička opcija u svojim projektima
Najbolji postupci tijekom korištenja serializacije u Javi
Slijedi nekoliko najboljih praksi koje treba slijediti
- Preporuča se upotreba javadoc @ serijska oznaka za označavanje polja koja se mogu serirati.
- The .biti ekstenzija je poželjna za datoteke koje predstavljaju serializirane objekte.
- Ne preporučuje se prolaz statičkih ili prolaznih polja zadana serializacija.
- Proširivi razredi ne bi trebalo serializirati ako nije obvezno.
- Unutarnja nastava treba izbjegavati sudjelovanje u serializaciji.
Ovim smo došli do kraja ovog članka. Nadam se da ste razumjeli osnove serializacije u Javi, njezine vrste i funkcionalnosti.
Pogledajte Edureka, pouzdane tvrtke za internetsko učenje s mrežom od više od 250 000 zadovoljnih učenika raširenih širom svijeta. Edurekin tečaj za obuku i certificiranje Java J2EE i SOA dizajniran je za studente i profesionalce koji žele biti programer Java. Tečaj je dizajniran da vam pruži početnu prednost u Java programiranju i osposobi vas za osnovne i napredne Java koncepte, zajedno s raznim Java okvirima poput Hibernate & Proljeće .
Imate pitanje za nas? Spomenite ga u odjeljku za komentare ovog članka 'Serijalizacija na Javi' i javit ćemo vam se što je prije moguće.