Kokia yra „Java“ serializavimo samprata?

Šis straipsnis padės visapusiškai suprasti „Java“ serializavimo koncepciją kartu su realiuoju laiku pateiktais pavyzdžiais, kad geriau suprastumėte.

Serializacija yra svarbi sąvoka, susijusi su objektų pavertimu baitų srautu, kad būtų galima perkelti Java objektus iš vienos „Java“ virtualiosios mašinos į kitą ir atkurti juos į pradinę formą. Aš išdėstysiu šio straipsnio lizdą taip:

Kas yra „Java“ serizavimas?

Serializavimas „Java“ yra „Java“ kodo konvertavimo procesas Objektas į a Baitų srautas , perkelti objekto kodą iš vienos „Java“ virtualiosios mašinos į kitą ir atkurti jį naudojant Dezerializacija.





Serialization-in-Java-Edureka-Picture-1

Kodėl mums reikia serializavimo Java kalba ?

Serializacija mums reikalinga dėl šių priežasčių:



  • Bendravimas : Serializavimas apima objekto procedūrą serializavimas ir užkrato pernešimas. Tai leidžia kelioms kompiuterinėms sistemoms vienu metu projektuoti, dalytis ir vykdyti objektus.

  • Talpykla : Laikas, sugaištamas statant objektą, yra daugiau, palyginti su laiku, reikalingu jį pašalinti iš serijos. Serializavimas sumažina laiko sąnaudas talpyklą milžiniški objektai.

  • Gili kopija : Klonavimas procesas yra paprastas naudojant Serialization. Tikslus kopija objekto gaunamasserializuojant objektą į a baitų masyvas ir tada panaikinkite jo nuoseklumą.



  • Kirsti JVM sinchronizavimas: Pagrindinis Serializacijos privalumas yra tas, kad jiveikia skirtinguose JVM, kurie gali veikti skirtingai architektūros arba Operacinės sistemos

  • Atkaklumas: Bet kurio objekto būsena gali būti tiesiogiai saugoma pritaikius jam Serialization ir saugoma a duomenų bazė kad taip galėtų būti gauta vėliau.

Kaip mes serializuojame objektą?

Į „Java“ objektas yra serijinis tik tada, jei jos klasė arba kuri nors iš jos pagrindinių klasių įgyvendina java . . Serijinis sąsaja arba jos sąsaja, java.io.Išskirtinis.

Serializacijos procese objekto būseną paverčiame baitų srautu, kad jį būtų galima perkelti iš vieno JVM į kitą ir grąžinti baitų srautą atgal į pradinį objektą.

// Sąsaja

paketas „Serial1“ importas java.io.Serializable public class Employee implements Serializable {private static final long serialVersionUID = 1L // Serial Version UID int id String name public Employee (int id, String name) {this.id = id this.name = name }}

// Serializuoti

paketas „Serial1“ importas 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 ('Serializavimas ir deserializavimas sėkmingai įvykdytas')} gaudymas (e išimtis) {System.out.println (e)}}}

Išvestis:

Serializavimas ir deserializavimas buvo sėkmingai įvykdyti

Dezerializacija : Tai yra atvirkštinis serizavimo procesas, kai siunčiančiojo objekto serijinis baitų srautas atkuriamas priimančiame gale.

// Deserialise

paketas „Serial1“ importas java.io. * klasė „Depersist“ {public static void main (String args []) {try {ObjectInputStream in = new ObjectInputStream (new FileInputStream ('output.txt')) Employee e1 = (Employee) in.readObject ( ) Darbuotojo e2 = (darbuotojo) in.readObject () darbuotojo e3 = (darbuotojo) in.readObject () System.out.println (e1.id + '' + e1.name) System.out.println (e2.id + '' + e2.pavadinimas) System.out.println (e3.id + '' + e3.name) in.close ()} sugavimas (e išimtis) {System.out.println (e)}}}

Išvestis:

20110 Jonas
22110 Džeris

20120 Sam

Serializavimo „Java“ privalumai ir trūkumai

Privalumai:

  • Serializacijos procesas yra a įmontuotas funkcija, kuriai atlikti serializavimui nereikia trečiųjų šalių programinės įrangos
  • Serializacijos procedūra yra įrodyta paprastas ir lengva suprasti

  • Serializavimo procedūra yra Universalus ir kūrėjai iš skirtingų sričių yra jai pažįstami

  • Tai lengva naudoti ir paprasta pritaikyti

  • Serijiniai duomenų srautai palaikyti šifravimą, glaudinimą, autentifikavimą ir saugus „Java“ skaičiavimas

  • Yra daug svarbiausios technologijos pasikliaudamas serializavimu.

Trūkumai:

kaip elgtis su iššokančiuoju selene

  • Objektai, kol DeSerialization tampa trapus ir jie nėra tikri, kad jie bus veiksmingai ištaisyti.

  • Pereinamieji kintamieji, deklaruoti, kol serializavimas sukuria atminties erdvę, tačiau konstruktorius nėra vadinamas, dėl kurio nepavyksta inicijuoti pereinamųjų kintamųjų, dėl kurių standartinio „Java Flow“ variantas.

  • Serializacijos procesas yra neefektyvus kalbant apie atminties panaudojimą.

  • Serializavimo nėra pageidautina naudoti tose programose, kurioms reikia lygiagreti prieiga be reikalavimo trečiųjų šalių API , nes Serializacija nepateikia jokio pereinamojo valdymo mechanizmo kiekvienai SE.

  • Serializavimo procedūros pasiūlyti nepavyksta smulkiagrūdis valdymas pasiekti objektus.

Praktiniai „Java“ serizavimo pavyzdžiai

Serializavimas naudojant paveldėjimą

1 atvejis: jei „Superclass“ gali būti serializuojamas, tada pagal numatytuosius nustatymus jos poklasius taip pat galima serializuoti.

Šiuo atveju poklasis yra serijinis pagal numatytuosius nustatymus, jei superklasė įgyvendina Serializuojama sąsaja

paketas SerializationInheritance importuoti java.io.FileInputStream importuoti java.io.FileOutputStream importuoti java.io.ObjectInputStream importuoti java.io.ObjectOutputStream importuoti java.io.Serializable A klasę įgyvendina Serializable {int i public A (int i) {this.i = i}} B klasė tęsiasi A {int j public B (int i, int j) {super (i) this.j = j}} public class Test {public static void main (String [] argumentai) meta išimtį {B b1 = new B (200,400) 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 ('Objektas buvo nuoseklus') FileInputStream fis = naujas FileInputStream ('abc.ser') ObjectInputStream ois = new ObjectInputStream (fis) B b2 = (B) ois.readObject () ois.close () fis.close () System.out.println ('Objektas buvo deserializuotas') System.out.println ('i = '+ b2.i) System.out.println (' j = '+ b2.j)}}

Išvestis:

j = 20
Objektas buvo serijinis
Objektas buvo deserializuotas
i = 200
j = 400

2 atvejis: poklasis gali būti nuoseklus, jei jis įdiegia „Serializable Interface“, net jei „Superclass“ neįdiegia „Serializable Interface“.

Šiuo atveju, jei superklasė nevykdo Serializuojama sąsaja , tada objektai poklasis galima rankiniu būdu serializuoti, poklasyje įdiegiant „Serializable Interface“.

paketas SerializationInheritance importuoti java.io.FileInputStream importuoti java.io.FileOutputStream importuoti java.io.ObjectInputStream importuoti java.io.ObjectOutputStream importuoti java.io.Serializable klasės superklass {int i public superclass (int i) {this.i = i} public superclass () {i = 50 System.out.println ('Superclass konstruktorius vadinamas')}} klasės poklasis pratęsia superklasės padargus Serializuojamas {int j viešasis poklasis (int i, int j) {super (i) this.j = j }} public class test2 {public static void main (String [] args) meta išimtį {subklasė b1 = nauja poklasė (10, 20) System.out.println ('i =' + b1.i) System.out.println ( 'j =' + b1.j) FileOutputStream fos = new FileOutputStream ('output.ser') ObjectOutputStream oos = naujas ObjectOutputStream (fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objektas buvo serijinis') FileInputStream fis = new FileInputStream ('output.ser') ObjectInputStream ois = new ObjectInputStream (fis) poklasis b2 = (poklasis) ois.readObject ( ) ois.close () fis.close () System.out.println ('Objektas buvo deserializuotas') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Objektas buvo serijinis
Paskambino superklasės konstruktorius
Objektas buvo deserializuotas
i = 50
j = 20

3 atvejis: jei superklasė gali būti serijinė, bet nereikia, kad poklasis būtų nuoseklus.

Tokiu atveju galima išvengti poklasio serizavimoįgyvendinant writeObject () ir readObject () metodai poklasyje ir jį reikia mesti „NotSerializableException“ iš šių metodų.

paketas SerializationInheritance importuoti java.io.FileInputStream importuoti java.io.FileOutputStream importuoti java.io.IOException importuoti java.io.NotSerializableException importuoti java.io.ObjectInputStream importuoti java.io.ObjectOutputStream importuoti java.io.ObjectOutputStream importuoti java.io.io. i public Tėvas (int i) {this.i = i}} klasės vaikas pratęsia Tėvą {int j public child (int i, int j) {super (i) this.j = j} private void writeObject (ObjectOutputStream out) meta IOException {thrown new NotSerializableException ()} private void readObject (ObjectInputStream in) išmeta IOException {thrown new NotSerializableException ()}} public class test3 {public static void main (String [] args) meta išimtį {child b1 = new child (100, 200) System.out.println ('i =' + b1.i) System.out.println ('j =' + b1.j) FileOutputStream fos = nauja FileOutputStream ('abc.ser') ObjectOutputStream oos = nauja ObjectOutputStream ( fos) oos.writeObject (b1) oos.close () fos.close () System.out.println ('Objektas buvo serijinis ') FileInputStream fis = new FileInputStream (' abc.ser ') ObjectInputStream ois = new ObjectInputStream (fis) child b2 = (child) ois.readObject () ois.close () fis.close () System.out. println ('Objektas buvo deserializuotas') System.out.println ('i =' + b2.i) System.out.println ('j =' + b2.j)}}

Išvestis:

i = 100
j = 200
Išimtis temoje „main“ java.io.NotSerializableException
„SerializationInheritance.child.writeObject“ (test3.java:48)
ne sun.reflect.NativeMethodAccessorImpl.invoke0 (vietinis metodas)

Serializavimas naudojant statinį narį

Serializavimo procese nepaisoma statinio nario lauko serizavimo. Serializacija yrasusijusios su naujausia objekto būsena. Taigi yra tik duomenys, susieti su konkrečiu klasės egzemplioriumiserijinis, bet ne laukas „Static member“.

paketas stati import java.io. * klasė „StaticSerial“ įgyvendina „Serializable“ {static int i = 100 public static void main (String ... ar) {StaticSerial ob = new StaticSerial () System.out.println ('Serialization, statinis narys turi vertę: '+ i) pabandykite {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 deserializacijos statinis narys turi vertę:' + i)} pagauti (e išimtis) {System.out.println (e)}}}

Išvestis:

Serializacijos metu statinio nario vertė yra 100
Po deserializacijos statinio nario vertė yra 99

Išorinė sąsaja

The Išorinė sąsaja „Java“ yra panašus į „Serialization“, tačiau vienintelis skirtumas yra tas, kad jis gali pasiūlyti pritaikyta serija kur jūs turite nuspręsti objektus, kuriuos reikia išpūsti sraute.

Išorinę sąsają galima rasti java.io ir joje pateikiami du būdai:

  • public void writeExternal (ObjectOutput out) išmeta IOException
  • public void readExternal (ObjectInput in) išmeta IOException

Pagrindiniai skirtumai tarp „Serialization“ ir „Externalizable“ yra šie:

  • Įgyvendinimas : Išorinė sąsaja neleidžia vartotojui aiškiai paminėti objektus, kurie bus serizuojami. Serializavimo sąsajoje visi objektai ir kintamieji yra serijiniai vykdymo laikas.

  • Metodai : Išorinę sąsają sudaro du metodai, būtent:

    • writeExternal ()

    • readExternal ()

Kadangi „Serializable Interface“ neapima jokių metodų.

  • Procesas: Serializavimo procesas išorinėje sąsajoje suteikia pritaikymas prie serializavimo proceso. Tačiau „Serialization Interface“ suteiks numatytas serijos procesas.

  • Suderinamumas ir valdymas atgal: Išorinė sąsaja palaiko serializavimą, neatsižvelgiant į versijos valdymas ir vienintelė problema yra ta, kad vartotojas turi būti atsakingas serizuodamas „Super Class“. Kita vertus, Serialization Interface reikalauja ta pati versija JVM abiejuose galuose, tačiau jis apima automatinį visų objektų ir klasių, įskaitant ir superklasę, serizavimą.

  • Viešas be argumentų konstruktorius: Išorės sąsajos poreikiai Viešas be argumentų konstruktorius rekonstruoti serijinį objektą. Nors „Serialization Interface“ nereikia „No-Arg Constructor“, ji naudoja atspindys rekonstruoti serijinį objektą ar klasę.

package ext import java.io. * klasės demonstracinė versija įgyvendina java.io.Serializable {public int a public String b public demo (int a, String b) {this.a = a this.b = b}} class Test {public static void main (String [] args) {Demo object = new Demo (1, 'Welcome to Edureka') String filename = 'file.ser' try try {FileOutputStream file = new FileOutputStream (filename) ObjectOutputStream out = new ObjectOutputStream (file) out .writeObject (object) out.close () file.close () System.out.println ('Objektas buvo serijizuotas')} sugauti (IOException ex) {System.out.println ('IOException yra sugautas')} Demonstravimo objektas1 = null pabandykite {FileInputStream file = new FileInputStream (failo pavadinimas) ObjectInputStream in = new ObjectInputStream (file) object1 = (Demo) in.readObject () in.close () file.close () System.out.println ('Objektas buvo deserialized ') System.out.println (' a = '+ object1.a) System.out.println (' b = '+ object1.b)} gaudyti (IOException ex) {System.out.println (' IOException pagauta ')} sugavimas („ClassNotFoundException ex“) {System.out .println („sugauta„ ClassNotFoundException “)}}}

Laikinas raktinis žodis

Laikinas raktinis žodis yra a rezervuotas raktinis žodis Java kalba. Jis naudojamas kaip kintamasis modifikuoti Serializacijos proceso metu. Deklaravus kintamąjį su laikinuoju raktiniu žodžiu, kintamasis nebus serializuotas.

Serijinės versijos UID

Prieš pradedant serializavimo procesą, kiekviena serializuojama klasė / objektas susiejamas su unikalus identifikavimo numeris teikia priimančiosios mašinos JVM. Šis unikalus ID yra vadinamas Serijinės versijos UID . Šis UID naudojamas kaip JVM priimančiojo galo identifikavimas, siekiant patvirtinti, kad tas pats objektas yra DeSerialized priimančiame gale.

Serializacijos prieštaravimai „Java“

„Oracle“ Architektai ketina pašalinti „Java“ serizavimą, nes mano, kad tai yra Šiurpi 1997 m. Klaida . Po įtemptų tyrimų „Oracle“ kūrėjai išsiaiškino keletą serializavimo procedūros projektavimo trūkumų, kurie kelia grėsmę duomenims.

1997 m.Markas Reinholdas teigia - Mes norėtume vadinti serializaciją „dovana, kuri nuolat teikiama“, o dovanojama dovanų rūšis yra saugumo spragos. Tikriausiai trečdalis visų „Java“ pažeidžiamumų yra susiję su serializavimu, tai gali būti daugiau nei pusė. Tai stebėtinai nestabilus pažeidžiamumų šaltinis, jau nekalbant apie nestabilumą “.

Yra tikimybė, kad serizavimas bus pašalintas arba pakeistas būsimuose „Java“ atnaujinimuose, ir, kita vertus, pradedantiesiems „Java“, „Serializavimas“ negalėjau būti idealistiniu variantu savo projektuose

Geriausia „Java“ serizavimo naudojimo praktika

Toliau pateikiamos kelios geriausios praktikos, kurių reikia laikytis

  • Rekomenduojama naudoti javadoc @ serijinė žyma, skirta žymėti serijinius laukus.
  • The .būti plėtinį pageidautina naudoti failams, vaizduojantiems serializuotus objektus.
  • Nerekomenduojama atlikti jokių statinių ar pereinamųjų laukų numatytasis serializavimas.
  • Išplečiamos klasės neturėtų būti serijinis, nebent taip yra privaloma.
  • Vidinės klasės reikėtų vengti dalyvauti serializacijoje.

Tuo mes priėjome šio straipsnio pabaigą. Tikiuosi, kad supratote „Java“ serizavimo pagrindus, jo tipus ir funkcijas.

kas yra žymeklio sąsaja java

Patikrinkite sukūrė patikima internetinė mokymosi įmonė „Edureka“, turinti daugiau nei 250 000 patenkintų besimokančiųjų tinklą visame pasaulyje. „Edureka“ „Java J2EE“ ir SOA mokymo ir sertifikavimo kursai yra skirti studentams ir specialistams, norintiems būti „Java“ kūrėjais. Kursas sukurtas tam, kad galėtumėte pradėti programuoti „Java“ ir išmokyti pagrindines ir pažangiausias „Java“ koncepcijas kartu su įvairiomis „Java“ sistemomis, tokiomis kaip „Hibernate“ Pavasaris .

Turite mums klausimą? Paminėkite tai šio straipsnio „Serialization in Java“ komentarų skyriuje ir mes kuo greičiau susisieksime su jumis.