Serializarea în Java: tot ce trebuie să știți [2022]

Publicat: 2021-01-04

Odată cu boom-ul din ce în ce mai mare al industriei IT, dependența noastră de aceasta pare să crească cu fiecare zi care trece. Această creștere constantă a împins mulți profesioniști care lucrează să adopte limbaje de programare în încercarea de a rămâne relevanți în industrie. În timp ce industria folosește mai multe limbi pentru a-și deservi clienții, câteva limbi sunt mai frecvent utilizate decât altele. Java este un astfel de limbaj.

Indiferent dacă sunteți mai proaspăt sau veteran, o cunoaștere solidă a Java vă va aduce beneficii la fiecare pas al călătoriei dvs. software. Ca orice alt limbaj de programare, Java are, de asemenea, o programă proprie cuprinzătoare. Trebuie să exersați limba zilnic pentru a înțelege toate conceptele diferite care punctează limba. Un astfel de concept care ajută foarte mult utilizatorii este practica serializării în Java.

Cuprins

Introducere

Serializarea în contextul Java se referă la procesul în care un obiect cod Java este convertit sistematic într-un Byte Stream. Acest lucru se face pentru a permite transferul eficient al codului obiect menționat de la o mașină virtuală Java la alta. Ulterior, acest lucru permite recrearea acestuia cu ajutorul deserializării. Folosim serializarea pentru a îndeplini mai multe obiective. Să aruncăm o privire la cele mai populare și relevante în secțiunea de mai jos.

De ce se folosește serializarea?

Fenomenul de reprezentare a unui obiect ca o secvență de octeți are cota sa justă de utilizare în paradigma de programare. Când procesul se extinde la reprezentarea datelor obiectului, de asemenea, utilitatea crește de mai multe ori. Mai jos sunt enumerate unele dintre cele mai comune utilizări ale serializării în Java.

Comunicare

Serializarea în Java permite o comunicare eficientă și promptă între mai multe sisteme informatice. Aceste unități folosesc serializarea și transmisia obiectelor pentru a facilita partajarea și proiectarea simultană a diferitelor obiecte. În consecință, acest lucru are ca rezultat și o eventuală execuție lină. În cazul bazelor de date voluminoase, serializarea permite o abordare extrem de simplificată a manipulării obiectelor.

Memorarea în cache

Memorarea în cache, într-un sens mai larg, se referă la metoda de stocare a informațiilor pentru a le accesa într-un moment ulterior, prin investirea unui timp minim pe ea. Serializarea în Java solicită stocarea în cache prin minimizarea timpului consumat în deserializarea unui obiect mare. Este cunoscut faptul că timpul necesar pentru construirea unui obiect este mult mai mare în comparație cu timpul necesar pentru deserializare. Prin urmare, serializarea ajută la optimizarea acestui consum de timp prin memorarea în cache a obiectelor relativ mai mari din amestec.

Deep Copy

Deep copy în Java se referă la procesul de copiere a obiectelor dintr-un arbore în așa fel încât să nu depindă de nici una dintre versiunile sale anterioare care ar putea fi supuse unui anumit grad de modificare. Acest proces de clonare este mult mai ușor prin adoptarea serializării. Prin serializarea obiectului într-o matrice de octeți și apoi prin deserializarea acestuia, utilizatorul poate realiza o replică a obiectului menționat.

Sincronizare între mașini virtuale Java

Principalul avantaj al practicării serializării constă în faptul că permite utilizatorului să opereze pe diferite JVM-uri. Odată ce serializarea este adoptată, nu contează dacă aceste JVM-uri lucrează pe aceleași arhitecturi și sisteme de operare sau nu pe aceleași sau diferite.

Persistenţă

Prin aplicarea serializării unui obiect, se poate stoca direct starea articolului fără niciun inconvenient. În plus, permite utilizatorului să salveze starea menționată într-o bază de date care poate fi preluată ulterior în orice moment în viitor.

Citiți: Întrebări și răspunsuri la interviu de serializare Java

Serializarea unui obiect - Procesul implicat

Înainte de a continua cu serializarea unui obiect, trebuie mai întâi să stabilim dacă acesta este serializabil sau nu. Acum, cum stabilim asta? Un obiect în Java este serializabil dacă și numai dacă clasa sa sau oricare dintre clasele sale părinte permite implementarea interfeței java.io.Serializable. Criteriile sunt îndeplinite și dacă aceste clase implementează și subinterfața sa, care este java.io.Externalizabil.

După cum sa discutat mai sus, sincronizarea JVM încrucișată este una dintre cele mai puternice aplicații de utilizare a serializării. Când serializăm un obiect, convertim starea acestui obiect într-un flux de octeți. Ca rezultat, devine posibil pentru noi să transferăm obiectul de la o mașină virtuală Java la alta. În consecință, acest flux de octeți poate fi convertit înapoi și în obiectul original.

Această conversie este denumită și deserializare. Este procesul invers de serializare în care fluxul de octeți al unui obiect de la expeditor care a fost serializat anterior este recreat la capătul de recepție.

Avantajele serializării în Java

În discutarea utilizărilor și aplicațiilor serializării în secțiunile anterioare, am aruncat deja puțină lumină asupra diferitelor sale merite. Acum este timpul să facem o scufundare mai profundă în ele.

  • Unul dintre cele mai semnificative avantaje ale serializării este faptul că este o caracteristică încorporată. Pentru a implementa sau a executa serializarea, nu trebuie să luați ajutorul niciunui software terță parte.
  • Chiar și pentru utilizatorii care sunt începători și doar își învață frânghiile, serializarea este un proces destul de ușor de învățat și de înțeles.
  • Adesea, dezvoltatorii care provin din medii diferite de programare primesc un fundal tactil atunci când trebuie să se ocupe de nuanțele unui nou limbaj. Cu toate acestea, în cazul serializării, procesul este universal și, prin urmare, destul de familiar cu toți dezvoltatorii de acolo.
  • Nu numai că este ușor de utilizat și implementat, dar și la fel de ușor de personalizat.
  • În prezent, există o serie de tehnologii critice care folosesc serializarea în operațiunile lor. Acest lucru se datorează faptului că fluxurile de date care sunt serializate acceptă criptarea, autentificarea, compresia și calcularea java securizată.

Dezavantajele serializării în Java

Niciun limbaj de programare nu este sută la sută perfect și nici ei nu pot pretinde că sunt. Ca urmare, conceptele și procesele care le constituie nu sunt lipsite de un set propriu de defecte. Iată câteva dintre dezavantajele generale asociate cu procesul de serializare.

  • Unele procese de serializare necesită ca deserializarea să fie aplicată și în tandem. Acum, dezavantajul aplicării deserializării este că face obiectele fragile. Ca rezultat, nu există niciodată o certitudine completă că respectivul obiect va fi deserializat eficient.
  • Când procesul de serializare este invocat, acesta determină crearea unui grup de variabile tranzitorii. Aceste variabile tranzitorii, atunci când sunt create, ocupă spațiu suplimentar de memorie. Cu toate acestea, multe dintre aceste variabile tranzitorii nu reușesc să fie inițializate deoarece constructorul nu este apelat în timpul acestor procese. Ulterior, acestea ajung să afecteze o variație a fluxului Java standard.
  • Cu toate optimizările consumului de timp, procesul de serializare este din ce în ce mai ineficient când vine vorba de utilizarea memoriei.
  • Procesul de serializare nu oferă niciun mecanism de control al tranziției pentru fiecare ediție standard a Java. Ca rezultat, nu este de preferat să fie utilizat în asociere cu aplicații care necesită acces paralel fără cerința unor API-uri terțe.
  • În timp ce utilizați serializarea, trebuie adesea să faceți compromisuri în obținerea unui control fin pentru a accesa obiectele.

Serializarea văzută printr-o lentilă practică

Până acum, am discutat despre procesul de serializare ca un concept teoretic, incluzând diferitele sale avantaje și dezavantaje. Acum este timpul să ne adâncim într-o discuție care ne permite să vizualizăm serializarea din punct de vedere practic și implementarea acesteia. Mai jos sunt enumerate câteva cazuri care ne ajută să înțelegem realizarea practică a serializării.

Trebuie să citiți: Proprietăți și beneficii JavaBeans: Cum ar trebui să utilizați?

Serializare și moștenire

Moștenirea în Java este definită în linii mari ca fenomenul în care o clasă dobândește sau moștenește metodele și câmpurile unei alte clase. Clasa care moștenește proprietățile este denumită subclasă, iar clasa ale cărei proprietăți sunt moștenite este denumită superclasă. Termenul de superclasă este, de asemenea, utilizat în mod interschimbabil cu clasa de bază și clasa părinte.

Primul nostru caz se referă la serializarea în contextul superclaselor. În general, dacă o superclasă este serializabilă, atunci subclasele sale pot fi considerate, de asemenea, a fi serializabile în mod implicit. Desigur, acest lucru este valabil numai dacă superclasa implementează interfața Serializable. Cu toate acestea, există și anumite cazuri când subclasa poate fi serializată chiar dacă superclasa nu implementează interfața Serializable.

Acest lucru are loc atunci când subclasa reușește să implementeze interfața Serializable în capacitatea sa unică. Dacă superclasa nu reușește să implementeze interfața Serializable în nicio circumstanță, atunci obiectele subclasei pot fi serializate manual atunci când subclasa însăși implementează interfața serializabilă.

Uneori, utilizatorul s-ar putea întâlni și cu o a treia posibilitate. Această posibilitate apare atunci când superclasa este serializabilă, dar utilizatorul nu trebuie să adopte procesul în ceea ce privește subclasa.

În situații ca acestea, există modalități prin care serializarea nedorită a subclasei poate fi prevenită în mod conștient. Acest lucru se poate realiza prin implementarea metodelor writeObject() și readObject() în subclasă. Cu toate acestea, implementarea acestor metode singură nu este suficientă. Pe lângă scrierea acestor metode, utilizatorul trebuie să se asigure că metodele menționate nu aruncă NotSerializableException din implementarea lor.

Serializarea cu ajutorul unui membru static

Când procesul de serializare este implementat, acesta ajunge să ignore membrii câmpului static din proces. Acest lucru se datorează în primul rând pentru că serializarea ca procedură se preocupă în mare măsură de cea mai recentă stare a obiectului în cauză. Ca rezultat, în timp ce datele asociate cu o anumită instanță a unei clase sunt serializate cu succes, câmpul membru static în legătură cu aceasta nu este.

Serializarea în ceea ce privește documentele XML

Serializarea obiectelor Java în XML poate fi realizată în mai multe moduri. În primul rând, acestea sunt realizate cu ajutorul XMLEncoder și XMLDecoder. Scopul principal al serializării obiectelor Java în documente XML constă în încercarea de a limita diferitele dezavantaje pe care procesul de serializare le implică în mod inerent.

Una dintre cele mai relevante probleme în procesul de serializare este aceea că logica care salvează și restabilește obiectele serializate se bazează doar pe structura internă a claselor constitutive. Nu reușește să ia în considerare niciuna dintre modificările care ar fi putut fi cauzate acelor clase în timpul care se scurge între salvarea obiectului și recuperarea acestuia. Ulterior, acest lucru are ca rezultat eșecul iminent al procesului de deserializare.

Serializarea dă naștere și la probleme de versiuni. Acest lucru se întâmplă atunci când utilizatorul salvează un obiect folosind o versiune a clasei, dar încearcă să deserializeze aceeași clasă folosind o versiune diferită sau nouă a clasei. În acest caz, procesul de deserializare eșuează și el.

Astfel, pentru a evita toate aceste probleme, unii utilizatori preferă serializarea obiectelor în documente XML decât să adopte abordarea convențională de a le serializa în format binar. În plus, serializarea obiectelor Java în documente XML asigură, de asemenea, că obiectul devine lizibil de către om, facilitând astfel un grad superior de comoditate.

Checkout: Întrebări și răspunsuri la interviu Java

Înțelegerea interfeței externalizabile

Interfața Externalizabil în Java este destul de similară cu cea a interfeței de serializare. Diferența constă în abilitățile lor de a oferi serializare personalizată. Interfața externalizabilă vă oferă opțiunea de a alege obiectele care doriți să fie stocate în flux, în timp ce interfața de serializare nu vă acordă același privilegiu.

Se poate folosi interfața externalizabilă sub java.io. Interfața externalizabilă oferă utilizatorului și două metode. Primul este public void writeExternal(ObjectOutput out) aruncă IOException. Celălalt este public void readExternal(ObjectOutput in) aruncă IOException.

Diferența dintre serializare și externalizare

Pe lângă capacitățile lor de a oferi serializare personalizată, unele alte variabile cheie deosebesc, de asemenea, serializarea și externalizarea. Următorul segment le aruncă o privire mai atentă.

Implementarea

Una dintre diferențele majore dintre interfețele serializabile și cele externalizabile constă în implementarea acestora. Interfața externalizabilă se așteaptă ca utilizatorul să menționeze în mod explicit obiectele pe care doresc să fie serializate. Acesta nu este cazul când se ocupă de interfața serialabilă. În interfața serializabilă, toate obiectele și variabilele sunt serializate, fără nicio diferențiere, în timpul rulării.

Metode

Interfața Externalizabilă constă în principal din două metode. Acestea sunt metoda writeExternal() și metoda readExternal(). Interfața serializabilă, pe de altă parte, nu cuprinde nicio metodă.

Proces

Când se realizează procesul de serializare în interfața externalizabilă, li se acordă privilegiul de serializare personalizată. În timp ce în interfața serializabilă, cineva se supune procesului de serializare implicit.

Compatibilitate și control invers

Interfața externabilă acceptă serializarea fără rezerve la controlul versiunii în cauză. Singura problemă cu această abordare este că utilizatorul trebuie să fie el însuși responsabil în timpul serializării superclasei. Dimpotrivă, interfața de serializare necesită ca aceeași versiune a JVM-urilor să fie prezentă la ambele capete. Cu toate acestea, permite o serializare implicită a tuturor obiectelor și claselor, inclusiv a superclasei.

Public No-Arg Constructor

În timpul reconstrucției obiectului serializat, interfața de externalizare necesită utilizarea constructorului public no-arg. Acest lucru este diferit în cazul interfeței de serializare care nu necesită în mod explicit constructorul no-arg, ci mai degrabă folosește reflecția pentru a reconstrui obiectele și clasele serializate.

Serializarea în Java: Controverse

Există destul de multe controverse care se atașează conceptului de serializare în Java. Mulți dintre ei se preocupă în primul rând de eliminarea serializării ca procedură. Se consideră pe scară largă că arhitecții Oracle au luat în considerare de multă vreme eliminarea serializării din Java, deoarece consideră că este o greșeală oribilă din 1997.

Conform cercetărilor lor, defectele în proiectarea procedurii de serializare sunt de așa natură încât reprezintă o amenințare pentru datele în sine. În această măsură, Mark Reinhold în 1997 a atribuit aproape o treime din toate vulnerabilitățile Java procesului de serializare, afirmând chiar că coeficientul ar putea fi confortabil mai mult decât atât.

Prin urmare, există o bună posibilitate ca serializarea ca construcție să fie complet eliminată sau înlocuită din analele Java în actualizările sale viitoare. Acest lucru s-ar putea întâmpla și pentru că majoritatea experților nu consideră că serializarea este o opțiune idealistă pe care începătorii în Java o pot implementa în proiectele lor.

Citiți și: Idei și subiecte de proiecte Java

Obțineți un curs de dezvoltare software de la cele mai bune universități din lume. Câștigă programe Executive PG, programe avansate de certificat sau programe de master pentru a-ți accelera cariera.

Concluzie

O discuție și deliberare asupra serializării nu pot fi încheiate prin aruncarea de lumină asupra câtorva dintre cele mai bune practici ale acesteia. Iată câteva pe care utilizatorul trebuie să le adopte pentru a-și asigura cea mai bună experiență.

  • Pentru a desemna câmpurile serializabile, trebuie să utilizați eticheta javadoc@serial.
  • Pentru fișierele care reprezintă obiecte serializate, este de preferat ca unul să folosească extensia .ser.
  • În mod normal, procesul de supunere a câmpurilor statice sau tranzitorii la serializarea implicită este descurajat.
  • Cu excepția cazului în care este absolut obligatoriu, trebuie, în toate circumstanțele, să încercați să evitați serializarea Claselor extensibile.
  • În timpul implementării serializării, trebuie să vă asigurați că evită implicarea claselor interne în procesul de serializare.

Dacă sunteți interesat să aflați mai multe despre Java, OOP și dezvoltarea de software full-stack, consultați programul Executive PG de la upGrad și IIIT-B în dezvoltarea de software Full-stack, care este conceput pentru profesioniști care lucrează și oferă peste 500 de ore de formare riguroasă, Peste 9 proiecte și sarcini, statutul de absolvenți IIIT-B, proiecte practice practice și asistență pentru locuri de muncă cu firme de top

Pregătiți-vă pentru o carieră a viitorului

Aplicați acum pentru masterat în inginerie software