Serializare în Java

Serializarea în Java este un mecanism care transformă starea unui obiect într-un flux de octeți. Deserializarea este procesul său invers. Prin deserializare, dintr-un flux de octeți, obiectul Java real este creat în memorie. Un astfel de mecanism persistă obiectul.

Fluxul de octeți astfel creat din serializare nu depinde de nicio platformă. Obiectul serializat pe o platformă poate fi deserializat pe orice altă platformă fără nici o problemă. Astfel, întregul proces de serializare și deserializare este independent de JVM.

Dacă un obiect de clasă urmează să fie serializat, atunci trebuie să implementăm interfața java.io.Serializable. Serializabil în java este o interfață de marker. Nu are câmpuri sau metode de implementat. O clasă poate fi serializată prin acest proces, care arată ca un proces Opt-In.

Serializarea în Java este implementată de cele două clase ObjectInputStream și ObjectOutputStream.

Tot ce este necesar este un înveliș peste ele, astfel încât să poată fi salvat în fișier sau poate fi trimis printr-o rețea.

Conceptul de serializare în Java

Clasa ObjectOutputStream, care este clasa de serializare, așa cum este menționat în secțiunea de mai sus, conține mai multe metode de scriere pentru scrierea diferitelor tipuri de date, dar o metodă este cea mai populară

public final void writeObject(Object x) throws IOException

Metoda de mai sus poate fi utilizată pentru serializarea unui obiect. Această metodă o trimite și în fluxul de ieșire. În același mod, clasa ObjectInputStream conține metoda de deserializare a obiectelor

public final Object readObject() throws IOException, ClassNotFoundException

Metoda de deserializare preia obiectul dintr-un flux și deserializează același lucru. Valoarea de returnare este din nou un obiect, astfel încât tot ce este necesar este să o aruncați la tipul de date relevant.

Pentru ca o clasă să fie serializată cu succes, există două condiții care trebuie îndeplinite -

  • io. Interfața serializabilă trebuie să fie pusă în aplicare de către clasă.
  • Toate câmpurile clasei trebuie să fie serializabile. Dacă niciun câmp nu este serializabil, atunci trebuie marcat trecător.

Dacă cineva trebuie să verifice dacă o clasă este serializabilă sau nu, soluția simplă este să verifice dacă clasa implementează metoda java.io.Serializable, dacă o face, atunci este serializabilă dacă nu, atunci nu este.

Unul ar trebui să observe că atunci când se serializează un obiect într-un fișier, practica standard este de a da fișierului o extensie .ser.

Metoda de serializare în Java

Dacă aceste metode sunt prezente în clasă, ele sunt utilizate pentru serializare în scopuri Java.

Metodă Descriere
public final void writeObject (Obiect obiect) aruncă IOException ()Aceasta va scrie obiectul specificat în ObjectOutputStream.
public void flush () aruncă IOException ()Aceasta va curge fluxul de ieșire curent.
public void close () aruncă IOException ()Aceasta va închide fluxul de ieșire curent.

Metoda de deserializare în Java

Metodă Descriere
public final Object readObject () aruncă IOException, ClassNotFoundException ()Acesta va citi un obiect din fluxul de intrare.
public void close () aruncă IOException ()Aceasta va închide ObjectInputStream.

Exemple de serializare în Java

În această secțiune, am discutat despre Serializare în Java cu exemple.

Un exemplu în Java este furnizat aici pentru a demonstra cum funcționează serializarea în Java. Creăm o clasă de angajați pentru a studia unele caracteristici și codul pentru aceleași este oferit mai jos. Această clasă de angajați implementează interfața Serializable.

public class Employee implements java.io.Serializable (
public String name;
public String address;
public transient int SSN;
public int number;
public void mailCheck() (
System.out.println("Mailing a letter to " + name + " " + address);
)
)

Când acest program se va face cu executarea, va fi creat un fișier numit angajat.ser. Acest program nu oferă o ieșire garantată, ci doar cu scop explicativ, iar obiectivul este să înțeleagă utilizarea și funcționarea acestuia.

import java.io.*;
public class SerializeDemo (
public static void main(String () args) (
Employee e = new Employee();
e.name = "Rahul Jain";
e.address = "epip, Bangalore";
e.SSN = 114433;
e.number = 131;
try (
FileOutputStream fileOut =
new FileOutputStream("/tmp/employee.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(e);
out.close();
fileOut.close();
System.out.printf("Serialized data saved in /tmp/employee.ser");
) catch (IOException i) (
i.printStackTrace();
)
)
)

Programul DeserializeDemo descris mai jos deserializează obiectul Angajat de mai sus creat în programul Serialize Demo .

import java.io.*;
public class DeserializeDemo (
public static void main(String () args) (
Employee e = null;
try (
FileInputStream fileIn = new FileInputStream("/tmp/employee.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
e = (Employee) in.readObject();
in.close();
fileIn.close();
) catch (IOException i) (
i.printStackTrace();
return;
) catch (ClassNotFoundException c) (
System.out.println("Employee class is not found");
c.printStackTrace();
return;
)
System.out.println("Deserialized Employee…");
System.out.println("Name: " + e.name);
System.out.println("Address: " + e.address);
System.out.println("SSN: " + e.SSN);
System.out.println("Number: " + e.number);
)
)

Codul de mai sus va produce următorul rezultat -

producție

Angajat deserializat …

Nume: Rahul Jain

Adresa: epip, Bangalore

SSN: 0

Numar: 131

Câteva puncte importante legate de programul de mai sus sunt prezentate mai jos -

  • Blocul try / catch de mai sus încearcă să prindă un ClassNotFoundException. Aceasta este declarată prin metoda readObject ().
  • Un JVM poate deserializa un obiect, numai dacă găsește bytecode pentru clasă.
  • Dacă JVM nu găsește o clasă în timpul deserializării, va arunca ClassNotFoundException.
  • valoarea de returnare a readObject () este întotdeauna trimisă la o referință a angajaților.
  • Valoarea câmpului SSN a fost 114433 inițial când obiectul a fost serializat, dar această valoare nu a fost trimisă fluxului de ieșire. Din cauza aceluiași obiect, câmpul deserializat SSN al angajaților este 0.

Concluzie

Mai sus, am introdus concepte de serializare și am oferit exemple. Să înțelegem nevoia de serializare ca observații finale.

  • Comunicare: Dacă două mașini care rulează același cod trebuie să comunice calea de ieșire ușoară este faptul că o mașină ar trebui să creeze un obiect care să conțină informații pe care le-ar transmite și apoi să serializeze acel obiect înainte de a-l trimite la cealaltă mașină. Nu este o metodă grozavă, dar se termină.
  • Persistență: Dacă starea de operare urmează să fie stocată într-o bază de date, aceasta este mai întâi serializată într-un tablou de octeți și apoi stocată în baza de date pentru regăsire la un moment ulterior.
  • Copiere profundă: Dacă trebuie creată o exacteplica a unui obiect, iar scrierea clasei de clone specializate este o muncă mult prea grea, atunci doar serializarea obiectului și apoi dezarhializarea acestuia către un alt obiect va atinge obiectivul.
  • Sincronizare JVM încrucișată: JVM-uri diferite care rulează pe mașini și arhitecturi diferite pot fi sincronizate.

Articole recomandate

Acesta a fost un ghid pentru Serializare în Java. Aici am discutat diferitele metode de serializare în Java cu exemple. De asemenea, puteți consulta articolul următor pentru a afla mai multe -

  1. Întrebări de interviu pentru dezvoltatori Java
  2. Lista Java vs. Lista cu Array
  3. Utilizări JavaScript