Serializacja w Javie

Serializacja w Javie jest mechanizmem przekształcającym stan obiektu w strumień bajtów. Deserializacja jest procesem odwrotnym. Poprzez deserializację ze strumienia bajtów tworzony jest rzeczywisty obiekt Java w pamięci. Taki mechanizm utrzymuje obiekt.

Tak utworzony strumień bajtów z serializacji nie zależy od żadnej platformy. Obiekt zserializowany na jednej platformie można bez problemu dokonać deserializacji na dowolnej innej platformie. Zatem cały proces serializacji i deserializacji jest niezależny od JVM.

Jeśli obiekt klasy ma być serializowany, należy zaimplementować interfejs java.io.Serializable. Serializable in java to interfejs znaczników. Nie ma pól ani metod do zaimplementowania. Klasa jest przekształcana do postaci szeregowej przez ten proces, który wygląda jak proces akceptacji.

Serializacja w Javie jest realizowana przez dwie klasy ObjectInputStream i ObjectOutputStream.

Wszystko, co jest wymagane, to opakowanie nad nimi, aby można je było zapisać do pliku lub wysłać przez sieć.

Pojęcie serializacji w Javie

Klasa ObjectOutputStream, która jest klasą serializacji, jak wspomniano w powyższej sekcji, zawiera kilka metod zapisu do zapisu różnych typów danych, ale jedna metoda jest najbardziej popularna

public final void writeObject(Object x) throws IOException

Powyższą metodę można zastosować do serializacji obiektu. Ta metoda wysyła go również do strumienia wyjściowego. W ten sam sposób klasa ObjectInputStream zawiera metodę deserializacji obiektu

public final Object readObject() throws IOException, ClassNotFoundException

Metoda deserializacji pobiera obiekt ze strumienia i deserializuje go. Zwracana wartość jest ponownie obiektem, więc wszystko, czego potrzeba, to rzutować ją na odpowiedni typ danych.

Aby klasa została pomyślnie serializowana, muszą zostać spełnione dwa warunki -

  • io. Interfejs z możliwością szeregowania musi zostać zaimplementowany przez klasę.
  • Wszystkie pola klasy muszą być możliwe do serializacji. Jeśli choćby jedno pole nie jest szeregowalne, należy je oznaczyć jako przejściowe.

Jeśli ktoś musi sprawdzić, czy klasa jest serializowalna, czy nie, prostym rozwiązaniem jest sprawdzenie, czy klasa implementuje metodę java.io.Serializable, jeśli tak, to można ją serializować, jeśli nie, to nie.

Należy zauważyć, że podczas serializacji obiektu do pliku standardową praktyką jest nadanie temu plikowi rozszerzenia .ser.

Metoda serializacji w Javie

Jeśli te metody są obecne w klasie, są one używane do serializacji w celach Java.

metoda Opis
public final void writeObject (Object obj) zgłasza wyjątek IOException ()Spowoduje to zapisanie określonego obiektu do ObjectOutputStream.
public void flush () zgłasza wyjątek IOException ()Spowoduje to opróżnienie bieżącego strumienia wyjściowego.
public void close () zgłasza wyjątek IOException ()Spowoduje to zamknięcie bieżącego strumienia wyjściowego.

Metoda deserializacji w Javie

metoda Opis
publiczny końcowy obiekt readObject () zgłasza wyjątek IOException, ClassNotFoundException ()Spowoduje to odczytanie obiektu ze strumienia wejściowego.
public void close () zgłasza wyjątek IOException ()Spowoduje to zamknięcie ObjectInputStream.

Przykłady serializacji w Javie

W tej sekcji omówiliśmy serializację w Javie z przykładami.

Podano tutaj przykład w Javie, aby pokazać, jak działa serializacja w Javie. Tworzymy klasę Employee, aby badać niektóre funkcje, a kod dla nich znajduje się poniżej. Ta klasa pracowników implementuje interfejs 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);
)
)

Gdy ten program zakończy działanie, zostanie utworzony plik o nazwie pracownik.ser. Ten program nie zapewnia gwarantowanej wydajności, lecz służy wyłącznie celom wyjaśniającym, a celem jest zrozumienie jego zastosowania i działania.

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();
)
)
)

Opisany poniżej program DeserializeDemo deserializuje powyższy obiekt pracownika utworzony w programie 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);
)
)

Powyższy kod da następujący wynik -

Wynik

Deserializowany pracownik…

Imię i nazwisko: Rahul Jain

Adres: epip, Bangalore

SSN: 0

Liczba: 131

Kilka ważnych punktów związanych z powyższym programem podano poniżej -

  • Powyższy blok try / catch próbuje złapać wyjątek ClassNotFoundException. Jest to zadeklarowane przez metodę readObject ().
  • JVM może dokonać deserializacji obiektu, tylko jeśli znajdzie kod bajtowy dla klasy.
  • Jeśli JVM nie znajdzie klasy podczas deserializacji, zgłosi wyjątek ClassNotFoundException.
  • zwracana wartość readObject () jest zawsze rzutowana na odwołanie pracownika.
  • Wartość pola SSN wynosiła początkowo 114433, gdy obiekt był serializowany, ale ponieważ ta wartość nie została wysłana do strumienia wyjściowego. Z tego samego powodu zdekrializowany obiekt pola Pracownik SSN ma wartość 0.

Wniosek

Powyżej przedstawiliśmy koncepcje serializacji i podaliśmy przykłady. Rozumiemy potrzebę serializacji jako nasze uwagi końcowe.

  • Komunikacja: jeśli dwie maszyny z tym samym kodem muszą się komunikować, najłatwiejszym wyjściem jest to, że jedna maszyna powinna zbudować obiekt zawierający informacje, które wyśle, a następnie serializować ten obiekt przed wysłaniem go do drugiego komputera. Nie jest to świetna metoda, ale wykonuje zadanie.
  • Trwałość: Jeśli stan operacji ma być przechowywany w bazie danych, najpierw jest serializowany do tablicy bajtów, a następnie przechowywany w bazie danych w celu późniejszego pobrania.
  • Głębokie kopiowanie: jeśli konieczne jest utworzenie dokładnej repliki obiektu, a napisanie specjalistycznej klasy klonowania jest zbyt ciężką pracą, wówczas jedynie serializacja obiektu, a następnie serializacja go do innego obiektu osiągnie cel.
  • Cross JVM Synchronization: różne maszyny JVM działające na różnych komputerach i architekturach mogą być synchronizowane.

Polecane artykuły

Jest to przewodnik po serializacji w Javie. Omówiliśmy tutaj różne metody serializacji w Javie z przykładami. Możesz także spojrzeć na następujący artykuł, aby dowiedzieć się więcej -

  1. Pytania do programisty Java
  2. Lista Java a lista macierzy
  3. Wykorzystuje JavaScript