Kakšen je koncept serializacije v Javi?



Ta članek bo pomagal pri celovitem pristopu k konceptu serializacije v Javi, skupaj s primeri v realnem času za boljše razumevanje.

Serializacija v je pomemben koncept, ki se ukvarja s pretvorbo predmetov v bajtni tok za prenos objektov java iz enega navideznega računalnika Java v drugega in njihovo ponovno ustvarjanje v prvotni obliki. Dokument za ta članek bom postavil na spodnji način:

Kaj je serializacija v Javi?

Serializacija v Javi je postopek pretvorbe kode Java Predmet v a Byte Stream , da prenesete kodo predmeta z enega navideznega računalnika Java na drugega in jo znova ustvarite s postopkom Deserializacija.





Serialization-in-Java-Edureka-Picture-1

Zakaj potrebujemo serializacijo v Javi ?

Serializacijo potrebujemo iz naslednjih razlogov:



  • Komunikacija : Serializacija vključuje postopek predmeta serializacija in prenos. To omogoča več računalniškim sistemom, da hkrati načrtujejo, delijo in izvajajo predmete.

  • Predpomnjenje : Čas, porabljen za gradnjo predmeta, je več kot čas, potreben za njegovo odstranitev iz serializacije. Serializacija zmanjša porabo časa za predpomnjenje orjaški predmeti.

  • Globoka kopija : Kloniranje postopek je preprost z uporabo serializacije. Natančno replika predmeta dobimo zserializiranje predmeta na a bajtna matrika in nato odstranite serializacijo.



  • Križ Sinhronizacija JVM: Glavna prednost serializacije je, dadeluje v različnih JVM-jih, ki se morda izvajajo na različnih arhitekture ali Operacijski sistemi

  • Vztrajnost: Stanje katerega koli predmeta je mogoče neposredno shraniti z uporabo serializacije in ga shraniti v zbirke podatkov tako da je lahko pridobljeno pozneje.

Kako serializiramo predmet?

TO Java objekt je serializirati če in samo, če njegov razred ali kateri koli nadrejeni razred izvaja bodisi java . jaz . Serializabilno vmesnik ali njegov podvmesnik, java.io.Externalizable.

V postopku serializacije pretvorimo stanje predmeta v bajtni tok, da ga lahko prenesemo iz enega JVM v drugega in vrnemo bajtni tok nazaj v prvotni objekt.

// Vmesnik

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 }}

// Serializiraj

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 = new Employee (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 ('Serializacija in deserializacija sta bili uspešno izvedeni')} catch (Izjema e) {System.out.println (e)}}}

Izhod:

Serializacija in deserializacija sta bili uspešno izvedeni

Deserializacija : Gre za obratni postopek serializacije, pri katerem je serijski bajtni tok predmeta od pošiljatelja ustvarjen na sprejemnem koncu.

// 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 ( ) Zaposleni e2 = (Zaposlen) in.readObject () Zaposlen e3 = (Zaposlen) 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 (Izjema e) {System.out.println (e)}}}

Izhod:

20110 Janez
22110 Jerry

20120 Sam

Prednosti in slabosti serializacije v Javi

Prednosti:

  • Postopek serializacije je a vgrajen funkcija, ki za izvajanje serializacije ne zahteva programske opreme drugih proizvajalcev
  • Dokazano je, da je postopek serializacije preprosto in enostavno razumeti

  • Postopek serializacije je univerzalni in razvijalci iz različnih okolij so mu znani

    iso 9000 proti šest sigm
  • Je enostaven za uporabo in enostavno prilagoditi

  • Serializirani tokovi podatkov podpira šifriranje, stiskanje, overjanje in varno računalništvo Java

  • Veliko jih je kritične tehnologije zanašanje na serializacijo.

Slabosti:

  • Predmeti, medtem ko DeSerialization postane krhka in niso prepričani, da bodo učinkovito deserializirani.

  • Prehodne spremenljivke, deklarirane med serializacijo, ustvarijo pomnilniški prostor, vendar konstruktor ni poklican, kar povzroči neuspeh pri inicializaciji prehodnih spremenljivk, kar povzroči sprememba standardnega Java toka.

  • Proces serializacije je neučinkovit v smislu izkoriščenosti pomnilnika.

  • Serializacija ni zaželena za uporabo v aplikacijah, ki jih potrebujejo hkratni dostop brez zahteve neodvisni API-ji , saj serializacija ne ponuja nobenega mehanizma za nadzor prehoda na vsako SE.

  • Postopek serializacije ni na voljo drobnozrnat nadzor za dostop do predmetov.

Praktični primeri serializacije v Javi

Serializacija z uporabo dedovanja

Primer - 1: Če je Superclass mogoče serializirati, so privzeto tudi njegovi podrazredi serializacijski.

V tem primeru je podrazred je privzeto serializirati, če je superrazred izvaja Serializiran vmesnik

kaj je brskalnik sqlite
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}} razred B razširja A {int j public B (int i, int j) {super (i) this.j = j}} test javnega razreda {public static void main (String [] args) vrže izjemo {B b1 = nov B (200.400) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = nov FileOutputStream ('abc.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt je bil serializiran') FileInputStream fis = new FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objekt je bil deserializiran') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Izhod:

j = 20
Predmet je serializiran
Predmet je bil deserializiran
i = 200
j = 400

Primer - 2: Podrazred je mogoče serializirati, če implementira vmesnik, ki ga je mogoče serirati, tudi če superrazred ne uporablja serializacijskega vmesnika.

V tem primeru, če superrazred ne izvaja Serializiran vmesnik , nato pa predmeti podrazred je mogoče ročno serializirati z izvajanjem serializabilnega vmesnika v podrazred.

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} public superclass () {i = 50 System.out.println ('konstruktor Superclass imenovan')}} podrazred razreda razširja superclass implementira Serializable {int j javni podrazred (int i, int j) {super (i) this.j = j }} test javnega razreda {public static void main (String [] args) vrže izjemo {podrazred b1 = nov podrazred (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = new ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objekt je bil serializiran') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) podrazred b2 = (podrazred) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objekt je bil deserializiran') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Predmet je serializiran
Kličen konstruktor superklase
Predmet je bil deserializiran
i = 50
j = 20

Primer - 3: Če je superrazred serializirati, vendar podrazreda ne potrebujemo za serializacijo.

V tem primeru je mogoče preprečiti serializacijo podrazredaz izvajanjem writeObject () in readObject () metode v podrazredu in ga je treba metati NotSerializableException iz teh metod.

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. i javni nadrejeni (int i) {this.i = i}} podrejen razred razširi nadrejeni {int j javni podrejeni (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) vrže IOException {metati novo NotSerializableException ()} private void readObject (ObjectInputStream in) meče IOException {metati novo NotSerializableException ()}} javni razred test3 {public static void main (String [] args) vrže izjemo {otrok b1 = nov otrok (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 bil serializiran ') FileInputStream fis = nov FileInputStream (' abc.ser ') ObjectInputStream ois = nov ObjectInputStream (fis) otrok b2 = (otrok) ois.readObject () ois.close () fis.close () System.out. println ('Objekt je bil deserializiran') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Izhod:

i = 100
j = 200
Izjema v niti 'main' java.io.NotSerializableException
na SerializationInheritance.child.writeObject (test3.java:48)
at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)

Serializacija z uporabo statičnega člana

Serializacija polja statičnega člana se v postopku serializacije prezre. Serializacija jepovezane z najnovejšim stanjem predmeta. Torej so samo podatki, povezani z določenim primerkom razredaserializirano, ne pa tudi polje Static member.

paket stati uvoz java.io. * razred StaticSerial izvaja Serializable {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('V času serializacije, statični član ima vrednost: '+ i) poskusite {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 ('Po deserializaciji ima statični član vrednost:' + i)} ulov (izjema e) {System.out.println (e)}}}

Izhod:

V času serializacije ima statični član vrednost: 100
Po deserializaciji ima statični član vrednost: 99

Izvlečni vmesnik

The Izvlečni vmesnik v Javi je podoben serializaciji, vendar je edina razlika v tem, da je sposoben ponuditi prilagojena serializacija kjer lahko določite predmete, ki jih želite vdreti v toku.

Vmesnik Externalizable je na voljo v java.io in ponuja dva načina:

sortirno polje c ++
  • public void writeExternal (ObjectOutput out) vrže IOException
  • public void readExternal (ObjectInput in) vrže IOException

Ključne razlike med serializacijo in eksternalizacijo so naslednje:

  • Izvajanje : Vmesnik, ki ga je mogoče eksternalizirati, izključuje uporabnika izrecno omeniti predmete, ki jih je treba serializirati. Medtem ko so v vmesniku za serializacijo, so vsi predmeti in spremenljivke serializirani v čas izvajanja.

  • Metode : Vmesnik, ki ga je mogoče eksternalizirati, je sestavljen iz dveh metod, in sicer:

    • writeExternal ()

    • readExternal ()

Medtem ko serijski vmesnik ne vključuje nobenih metod.

  • Postopek: Postopek serializacije v zunanjem vmesniku zagotavlja prilagajanje postopku serializacije. Toda serijski vmesnik bo zagotovil privzeto postopek serializacije.

  • Združljivost in nadzor nazaj: Externalizable Interface podpira serializacijo ne glede na nadzor različic in edina težava je v tem, da mora biti uporabnik odgovoren pri serializaciji Super Class. Po drugi strani pa serijski vmesnik zahteva ista različica JVM-jev na obeh koncih, vendar vključuje samodejno serializacijo vseh predmetov in razredov, vključno s superrazredom.

  • Javni konstruktor brez arg: Potrebe po vmesniku za eksternalizacijo Javni No-Arg Constructor za rekonstrukcijo serializiranega predmeta. Medtem ko vmesnik za serializacijo ne potrebuje konstruktorja No-Arg, namesto tega uporablja refleksija za rekonstrukcijo serializiranega predmeta ali razreda.

paket ext import java.io. * class Demo izvaja java.io.Serializable {public int a public String b public Demo (int a, String b) {this.a = a this.b = b}} Test razreda {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 je ujet')} Demo object1 = null try {FileInputStream file = new FileInputStream (ime datoteke) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Objekt je bil deserializiran ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} catch (IOException ex) {System.out.println (' IOException je ujet ')} catch (ClassNotFoundException ex) {System.out .println ('ClassNotFoundException je ujet')}}}

Prehodna ključna beseda

Prehodna ključna beseda je rezervirana ključna beseda v Javi. Uporablja se kot spremenljivka spremeni v času postopka serializacije. Deklariranje spremenljivke s ključno besedo Transient preprečuje, da bi bila spremenljivka serializirana.

UID serijske različice

Preden se začne postopek serializacije, se vsak razred / objekt, ki ga je mogoče serirati, poveže z enolično identifikacijsko številko ki jih zagotavlja JVM gostiteljske naprave. Ta enolični ID se imenuje UID serijske različice . Ta UID se uporablja kot identifikacija s strani JVM sprejemnega konca, da se potrdi, da je isti predmet na prevzemnem koncu deserializiran.

Kontroverze serializacije v Javi

Oracle Arhitekti nameravajo odstraniti serializacijo z Jave, saj jo imajo za Grozljiva napaka iz leta 1997 . Po razburjenih raziskavah so razvijalci v podjetju Oracle ugotovili nekaj napak pri zasnovi postopka serializacije, ki ogrožajo podatke.

Leta 1997Mark Reinhold trdi - ' Serializaciji radi rečemo 'darilo, ki se obdaruje', vrsta darila, ki ga nadaljuje, pa so varnostne ranljivosti. Verjetno je tretjina vseh ranljivosti Java vključevala serializacijo, lahko bi bila več kot polovica. To je osupljivo ploden vir ranljivosti, da o nestabilnostih niti ne govorimo. '.

Obstajajo možnosti, da bi bila serializacija odstranjena ali nadomeščena v prihajajočih posodobitvah Jave, po drugi strani pa bi bila za začetnike v Javi serializacija ne bi mogel biti idealistična možnost v svojih projektih

Najboljše prakse med uporabo serializacije v Javi

Sledi nekaj najboljših praks, ki jih je treba upoštevati

  • Priporočljiva uporaba javadoc @ serijska oznaka za označevanje polj, ki jih je mogoče serirati.
  • The .biti Priporočeno je, da se pripona uporablja za datoteke, ki predstavljajo zaporedne predmete.
  • Priporočljivo je, da se prestavijo nobena statična ali prehodna polja privzeta serializacija.
  • Razširljivi razredi ne sme biti serializirano, razen če je obvezno.
  • Notranji razredi se je treba izogibati sodelovanju pri serializaciji.

S tem smo prišli do konca tega članka. Upam, da ste razumeli osnove serializacije v Javi, njene vrste in funkcionalnosti.

Oglejte si Edureka, zaupanja vredno podjetje za spletno učenje z mrežo več kot 250.000 zadovoljnih učencev, ki se širijo po vsem svetu. Edurekin tečaj za usposabljanje in certificiranje Java J2EE in SOA je namenjen študentom in strokovnjakom, ki želijo biti razvijalec Java. Tečaj je zasnovan tako, da vam omogoči uvod v programiranje Java in vas usposobi za osnovne in napredne koncepte Java, skupaj z različnimi Java okviri, kot so Hibernate & Pomlad .

Imate vprašanje za nas? Omenite ga v oddelku za komentarje tega članka »Serializacija v Javi« in v najkrajšem možnem času se vam bomo oglasili.