
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 -
- Întrebări de interviu pentru dezvoltatori Java
- Lista Java vs. Lista cu Array
- Utilizări JavaScript