Interfață serializabilă în Java cu exemple

Publicat: 2021-11-29

Java oferă mai multe pachete, dintre care interfața Serializable este unul. Este prezent în pachetul Java java.io și este un tip de interfață de marcare. Când este definit ca o interfață de marcare, nu există metode sau câmpuri prezente în interfață. Deci, ori de câte ori vreo clasă implementează interfața, interfața nu este obligată să implementeze nicio metodă. Clasele implementează interfața dacă o clasă dorește ca instanțele lor să fie serializate sau deserializate.

Mecanismul de serializare este utilizat pentru conversia stării unui obiect într-un flux de octeți. Acest mecanism este realizat prin utilizarea ObjectOutputStream. Procesul de deserializare este exact opusul procesului de serializare. În acest caz, fluxul de octeți este convertit înapoi în obiectul Java. ObjectInputStream este folosit pentru deserializare.

Cuprins

Serializare

Conversia stării oricărui obiect într-un flux de octeți este cunoscută sub numele de serializare. Iar opusul serializării este deserializarea. Un obiect din Java poate fi convertit într-un flux de octeți statici. Acest flux static poate fi apoi salvat într-o bază de date sau poate fi, de asemenea, transferat într-o altă rețea. Procesul de serializare este dependent de instanță. Aceasta înseamnă că serializarea obiectelor poate fi efectuată pe o platformă, iar apoi deserializarea obiectelor poate fi efectuată pe o altă platformă. Un anumit tip de interfață de marcare, „Serializable”, este implementat pentru procesul de serializare. Deci, clasele eligibile pentru serializare, adică clasa serializabilă în Java , ar trebui să implementeze interfața de marcare.

Acest mecanism de scriere a stării unui obiect într-un flux de octeți este cunoscut sub numele de serializare. Mecanismul este utilizat în principal în tehnologiile JMS, EJB, JPA, RMI și Hibernate.

ObjectInputStream și ObjectOutputStream sunt formele claselor de nivel înalt care extind java.io.InputStream și java.io.OutputStream. Tipurile primitive și graficele obiectului pot fi scrise în OutputStream de ObjectOutputStream într-un octet

curent. Fluxul care rezultă din conversie poate fi citit prin ObjectInputStream. Deci, pentru serializare, metoda writeObject() este apelată din ObjectOutputStream, iar pentru deserializare, metoda readObject() este apelată din clasa ObjectInputStream.

Metoda care este cea mai importantă în ObjectOutputStream este:

Linia de cod de mai sus este preluată de la https://www.baeldung.com/java-serialization.

În linia de cod de mai sus, un obiect care este serializabil este preluat și apoi este convertit într-un flux sau flux de octeți.

În cazul ObjectInputStream, metoda cea mai critică este:

Linia de cod de mai sus este preluată de la https://www.baeldung.com/java-serialization.

Linia de cod de mai sus poate citi secvența de octeți și poate converti acest flux de octeți într-un obiect Java. Obiectul original poate fi aruncat înapoi prin aceasta.

O ilustrare a procesului de serializare poate fi descrisă mai jos:

O clasă „Persoană” este luată în considerare pentru serializare. Câmpurile statice nu sunt serializate și aparțin unor clase. Câmpurile de clasă pot fi ignorate folosind cuvântul cheie „tranzitoriu” în procesul de serializare.

Sursă

Obiectul tipului de persoană poate fi salvat într-un fișier local, iar apoi valoarea este citită înapoi. Codul afișat mai jos poate fi folosit în acest scop.

ObjectOutputStream a fost folosit pentru a salva starea obiectului într-un fișier prin utilizarea FileOutputStream. În acest exemplu, un fișier numit „yourfile.txt” a fost creat în directorul proiectului. Prin utilizarea FileInputStream, fișierul creat este încărcat. Acest flux este apoi preluat de ObjectInputStream și este convertit într-un obiect nou cu numele p2. Starea obiectului încărcat este în sfârșit testată și se potrivește cu starea obiectului original. Obiectul care este încărcat trebuie să fie prezentat în mod explicit persoanei tipice.

Avertismente în serializarea Java

1. Moștenirea și compoziția

Ori de câte ori un utilizator implementează interfața java.io.Serializable, toate subclasele de clasă care implementează interfața devin serializabile. De asemenea, dacă un obiect deține o referință la un obiect diferit, obiectele la care se face referire pentru a implementa interfața sunt serializabile separat; dacă aceste obiecte nu implementează interfața, atunci o excepție va fi eliminată. Excepția eliminată va fi NotSerializableException. De asemenea, dacă presupunem că o matrice de obiecte este stocată la un obiect serializabil, toate obiectele matrice ar trebui serializate. Dacă nu are loc nicio serializare a obiectelor, atunci va arunca excepția „NotSerializableException”.

2. Versiunea de serie UID

Pentru fiecare clasă care implementează interfața Serializable, fiecărei clase este asociat un număr. Numărul este asociat cu mașina virtuală Java. Acest lucru se face în principal pentru a verifica dacă obiectele care sunt încărcate și salvate au atributele exacte. Numai dacă atributele sunt aceleași, obiectele ar fi compatibile la serializare. IDE-urile generează aceste numere automat și se bazează în principal pe numele clasei, atributele acesteia și modificatorii de acces asociați cu aceasta. O excepție, „InvalidClassException”, va fi lansată dacă în urma modificărilor rezultă un număr diferit.

Dacă un serialVersionUID nu este declarat de o clasă serializabilă, JVM-ul îl va genera automat în timpul rulării. Deși va exista generarea automată a numărului, este totuși recomandat ca clasele să declare un serialVersionUID. Acest lucru se datorează faptului că serialVersionUID, care va fi generat automat, va depinde de compilator și uneori poate arunca InvalidClassExceptions neașteptate.

3. Serializare personalizată

O modalitate implicită a fost setată în Java pentru serializarea obiectelor. Java poate suprascrie acest comportament implicit. Există o modalitate de serializare personalizată. Este deosebit de util în cazurile în care obiectul care are atribute neserializabile este încercat să fie serializat. Serializarea pentru astfel de obiecte se poate face prin două metode în cadrul unei clase pe care utilizatorul dorește să fie serializată. Aceste două metode sunt:

Cele două metode de mai sus pot fi utilizate pentru a serializa atributele în orice formă care poate fi serializată, care mai devreme au fost neserializabile.

Avantajele serializării în Java

Unul dintre avantajele serializării în Java este că starea unui obiect poate fi parcursă într-o rețea.

Interfața Java java.io.Serializable

java.io.Serializable este o interfață de marcare, ceea ce înseamnă că nu există metode și obiecte în interfață. Funcția principală a interfeței de marcare este de a marca

clase de Java pentru a oferi o capacitate specială tuturor obiectelor claselor. Exemple de interfețe de marcare sunt Remote și Cloneable.

Interfața trebuie să fie implementată de orice clasă care folosește interfața pentru serializarea obiectelor sale. În mod implicit, clasele precum clasele wrapper și clasa String implementează interfața java.io.Serializable.

Mai jos este prezentat un exemplu serializat cu Java.

În codul de mai sus, se poate observa că clasa Student implementează interfața Serializable. Prin urmare, odată ce clasa implementează interfața Serializable, obiectele din clasă pot fi convertite în octeți de flux.

  • Clasa ObjectOutputStream

Această clasă este folosită pentru scrierea tipurilor primitive de date și a obiectelor Java în OutputStream. Obiectul care acceptă interfața java.io.Serializable poate fi folosit pentru a fi scris în fluxuri.

  • Clasa ObjectInputStream

Toate datele primitive care au fost scrise folosind ObjectOutputStream sunt deserializate folosind ObjectInputStream.

Un exemplu de interfață serializabilă în Java este prezentat mai jos.

În acest exemplu, clasa Student va fi serializată. Metoda writeObject() a clasei ObjectOutputStream, oferă toată funcționalitatea pentru serializarea obiectelor. Starea obiectului este salvată într-un fișier cu numele f.txt.

Concluzii

Articolul a discutat despre conceptul de serializare în Java. A enumerat interfețele și celelalte metode importante necesare pentru serializarea obiectelor unei clase. Procesul de serializare este întotdeauna asociat cu un id sau un număr cu fiecare clasă serializabilă. Acest număr este denumit SerialVersionUID. Utilizarea principală a SerialVersionUID este de a verifica expeditorul și receptorul pentru obiectul care urmează să fie serializat. Acest lucru se datorează faptului că atât expeditorul cât și receptorul ar trebui să fie la fel.

Este o caracteristică importantă a limbajului de programare Java. Dacă doriți să aflați mai multe despre astfel de caracteristici și concepte importante în Java și să vă stăpâniți abilitățile de limbaj de programare, puteți verifica Cursurile de Inginerie Software oferite de upGrad. Dacă sunteți un profesionist, cursul este cel mai potrivit pentru dvs. Pentru orice formă de întrebări, echipa noastră de asistență poate fi contactată. De asemenea, puteți naviga pe site-ul nostru pentru cursul specific și puteți obține informații detaliate.

Ce este interfața serializabilă în Java?

Interfața serializabilă este o interfață de marcare. Interfața marker oferă un indiciu pentru runtime Java că clasa de implementare își permite să fie serializată. Runtime va profita de această interfață pentru a serializa obiectul. Interfața serializabilă în java este o interfață specială care trebuie implementată de clasele de date în java. Când o clasă implementează această interfață, aceasta poate fi persistată într-o bază de date. Această interfață este declarată în pachetul java.io. Interfața serializabilă are două metode, readResolve() și writeReplace() , care sunt folosite pentru a citi și scrie obiectul în baza de date.

Ce se întâmplă dacă implementăm interfața Serializable în Java?

Implementarea interfeței serializabile în Java înseamnă a avea un obiect care poate fi serializat și deserializat în orice sistem cu interfață serializată. Implementarea unei astfel de interfețe ar fi eficientă atunci când clasa este serializată extern de biblioteci terțe (JSON, XML etc.) sau prin protocoale de rețea. Când o variabilă este declarată ca Serializabil, atunci fiecare instanță a variabilei va fi serializată și deserializată dacă este transmisă ca parametru unei metode sau când este returnată de la o metodă. Serializarea se realizează programatic, astfel încât starea unui obiect să poată fi păstrată pentru mai târziu, atunci când trebuie deserializat și prezentat utilizatorului obiectului.

Putem transfera un obiect serializat prin rețea?

Un obiect serializat este un obiect care conține un flux de octeți. Constructorul obiectului sau metodele writeObject() / readObject() sunt folosite pentru a plasa fluxul de octeți în obiect. Datele stocate pot fi text, audio, video sau orice date personalizate ale aplicației. Datele pentru aceste obiecte pot fi stocate într-un fișier sau pe un server la distanță. Pentru a transfera obiecte serializate prin rețea, trebuie să utilizați protocolul RMI (Remote Method Invocation). RMI este un protocol bun pentru crearea de aplicații distribuite. Acesta permite clientului să comunice cu metode de pe obiecte dintr-o aplicație Java care rulează pe un server. Protocolul RMI este un mecanism Remote Procedure Call (RPC).