Koji je koncept serializacije u Javi?



Ovaj će članak pomoći cjelovitom pristupu konceptu serializacije u Javi, zajedno s primjerima u stvarnom vremenu za bolje razumijevanje.

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?

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.





Serialization-in-Java-Edureka-Picture-1

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.