logo

Serializacja i deserializacja w Javie

  1. Serializacja
  2. Interfejs umożliwiający serializację
  3. Przykład serializacji
  4. Przykład deserializacji
  5. Serializacja z dziedziczeniem
  6. Interfejs możliwy do uzewnętrznienia
  7. Serializacja i element danych statycznych

Serializacja w Javie jest mechanizmem zapisanie stanu obiektu w strumieniu bajtów . Stosowany jest głównie w technologiach Hibernate, RMI, JPA, EJB i JMS.

Nazywa się odwrotną operacją serializacji deserializacja gdzie strumień bajtów jest konwertowany na obiekt. Proces serializacji i deserializacji jest niezależny od platformy, co oznacza, że ​​można serializować obiekt na jednej platformie i deserializować go na innej platformie.

Aby serializować obiekt, wywołujemy metodę napiszObiekt() metoda Strumień wyjściowy obiektu klasę, a w przypadku deserializacji wywołujemy klasę przeczytajObiekt() metoda Strumień wejściowy obiektu klasa.

Musimy wdrożyć Możliwość serializacji interfejs do serializacji obiektu.

Zalety serializacji Java

Stosowany jest głównie do śledzenia stanu obiektu w sieci (tzw. marshalling).

przekonwertuj str na int
serializacja Javy

Interfejs java.io.Serializowalny

Możliwość serializacji jest interfejsem znacznika (nie ma elementu danych ani metody). Służy do „oznaczania” klas Java, aby obiekty tych klas mogły uzyskać określone możliwości. The Możliwość klonowania I Zdalny są także interfejsami znaczników.

The Możliwość serializacji interfejs musi zostać zaimplementowany przez klasę, której obiekt musi zostać utrwalony.

Klasa String i wszystkie klasy opakowujące implementują metodę Możliwość serializacji java.io interfejs domyślnie.

Zobaczmy przykład podany poniżej:

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

W powyższym przykładzie Student klasa implementuje interfejs umożliwiający serializację. Teraz jego obiekty można przekształcić w strumień. Implementację głównej klasy pokazano w następnym kodzie.

Klasa ObjectOutputStream

Klasa ObjectOutputStream służy do zapisywania pierwotnych typów danych i obiektów Java w strumieniu wyjściowym. Do strumieni można zapisywać wyłącznie obiekty obsługujące interfejs java.io.Serializable.

Konstruktor

1) public ObjectOutputStream(OutputStream out) zgłasza wyjątek IOException {}Tworzy obiekt ObjectOutputStream, który zapisuje do określonego strumienia wyjściowego.

Ważne metody

metodaOpis
1) publiczny końcowy void writeObject(Object obj) zgłasza wyjątek IOException {}Zapisuje określony obiekt w ObjectOutputStream.
2) public void Flush() zgłasza wyjątek IOException {}Opróżnia bieżący strumień wyjściowy.
3) public void close() zgłasza wyjątek IOException {}Zamyka bieżący strumień wyjściowy.

Klasa ObjectInputStream

Obiekt ObjectInputStream deserializuje obiekty i pierwotne dane zapisane przy użyciu obiektu ObjectOutputStream.

Konstruktor

1) public ObjectInputStream(InputStream in) zgłasza wyjątek IOException {}Tworzy obiekt ObjectInputStream, który odczytuje z określonego strumienia wejściowego.

Ważne metody

klucz ins
metodaOpis
1) publiczny obiekt końcowy readObject() zgłasza wyjątek IOException, ClassNotFoundException{}Odczytuje obiekt ze strumienia wejściowego.
2) public void close() zgłasza wyjątek IOException {}Zamyka ObjectInputStream.

Przykład serializacji Java

W tym przykładzie będziemy serializować obiekt Student klasa z powyższego kodu. Metoda writeObject() klasy ObjectOutputStream zapewnia funkcjonalność serializacji obiektu. Stan obiektu zapisujemy w pliku o nazwie f.txt.

Persist.java

 import java.io.*; class Persist{ public static void main(String args[]){ try{ //Creating the object Student s1 =new Student(211,'ravi'); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} } } 

Wyjście:

 success 
pobierz ten przykład serializacji

Przykład deserializacji Java

Deserializacja to proces rekonstrukcji obiektu ze stanu serializowanego. Jest to operacja odwrotna do serializacji. Zobaczmy przykład, w którym odczytujemy dane z deserializacji obiektu.

Deserializacja to proces rekonstrukcji obiektu ze stanu serializowanego. Jest to operacja odwrotna do serializacji. Zobaczmy przykład, w którym odczytujemy dane z deserializacji obiektu.

Depersist.java

 import java.io.*; class Depersist{ public static void main(String args[]){ try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Wyjście:

211 ravi 
pobierz ten przykład deserializacji

Serializacja Java z dziedziczeniem (relacja IS-A)

Jeśli klasa implementuje Interfejs umożliwiający serializację wtedy wszystkie jego podklasy będą również możliwe do serializacji. Zobaczmy przykład podany poniżej:

funkcja statyczna w Javie

SerializujISA.java

 import java.io.Serializable; class Person implements Serializable{ int id; String name; Person(int id, String name) { this.id = id; this.name = name; } } class Student extends Person{ String course; int fee; public Student(int id, String name, String course, int fee) { super(id,name); this.course=course; this.fee=fee; } } public class SerializeISA { public static void main(String args[]) { try{ //Creating the object Student s1 =new Student(211,'ravi','Engineering',50000); //Creating stream and writing the object FileOutputStream fout=new FileOutputStream('f.txt'); ObjectOutputStream out=new ObjectOutputStream(fout); out.writeObject(s1); out.flush(); //closing the stream out.close(); System.out.println('success'); }catch(Exception e){System.out.println(e);} try{ //Creating stream to read the object ObjectInputStream in=new ObjectInputStream(new FileInputStream('f.txt')); Student s=(Student)in.readObject(); //printing the data of the serialized object System.out.println(s.id+' '+s.name+' '+s.course+' '+s.fee); //closing the stream in.close(); }catch(Exception e){System.out.println(e);} } } 

Wyjście:

 success 211 ravi Engineering 50000 

Klasa SerializeISA serializowała obiekt klasy Student, który stanowi rozszerzenie klasy Person, która jest możliwa do serializacji. Właściwości klasy nadrzędnej są dziedziczone do podklas, więc jeśli klasa nadrzędna jest możliwa do serializacji, podklasa również będzie.

Serializacja Java z agregacją (relacja HAS-A)

Jeśli klasa ma odwołanie do innej klasy, wszystkie odniesienia muszą być możliwe do serializacji, w przeciwnym razie proces serializacji nie zostanie przeprowadzony. W takim wypadku, Wyjątek NotSerializableException jest zgłaszany w czasie wykonywania.

Adres.java

 class Address{ String addressLine,city,state; public Address(String addressLine, String city, String state) { this.addressLine=addressLine; this.city=city; this.state=state; } } 

Student.java

 import java.io.Serializable; public class Student implements Serializable{ int id; String name; Address address;//HAS-A public Student(int id, String name) { this.id = id; this.name = name; } } 

Ponieważ adresu nie można serializować, nie można serializować instancji klasy Student.

Uwaga: Wszystkie obiekty w obiekcie muszą umożliwiać serializację.

Serializacja Java ze statycznym elementem danych

Jeśli w klasie znajduje się jakikolwiek statyczny element danych, nie zostanie on serializowany, ponieważ element statyczny jest częścią klasy, a nie obiektem.

Pracownik.java

 class Employee implements Serializable{ int id; String name; static String company='SSS IT Pvt Ltd';//it won't be serialized public Student(int id, String name) { this.id = id; this.name = name; } } 

Serializacja Java z tablicą lub kolekcją

Reguła: W przypadku tablicy lub kolekcji wszystkie obiekty tablicy lub kolekcji muszą umożliwiać serializację. Jeśli dowolnego obiektu nie można serializować, serializacja zakończy się niepowodzeniem.

Możliwość zewnętrznej obsługi w Javie

Interfejs Externalizable umożliwia zapisanie stanu obiektu w strumieniu bajtów w formacie skompresowanym. To nie jest interfejs znacznika.

Interfejs Externalizable udostępnia dwie metody:

    public void writeExternal (ObjectOutput out) zgłasza wyjątek IOException public void readExternal (ObjectInput in) zgłasza wyjątek IOException

Przejściowe słowo kluczowe Java

Jeśli nie chcesz serializować żadnego elementu danych klasy, możesz oznaczyć go jako przejściowy.

Pracownik.java

 class Employee implements Serializable{ transient int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } } 

Teraz id nie będzie serializowany, więc gdy deserializujesz obiekt po serializacji, nie otrzymasz wartości id. Zawsze zwróci wartość domyślną. W takim przypadku zwróci 0, ponieważ typ danych id jest liczbą całkowitą.

Odwiedź następną stronę, aby uzyskać więcej szczegółów.

Wersja seryjnaUID

Proces serializacji w czasie wykonywania wiąże identyfikator z każdą klasą Serializable, znaną jako SerialVersionUID. Służy do weryfikacji nadawcy i odbiorcy serializowanego obiektu. Nadawca i odbiorca muszą być tacy sami. Aby to zweryfikować, używany jest SerialVersionUID. Nadawca i odbiorca muszą mieć ten sam SerialVersionUID, w przeciwnym razie Nieprawidłowy wyjątek klasy zostanie wyrzucony podczas deserializacji obiektu. Możemy również zadeklarować własny SerialVersionUID w klasie Serializable. W tym celu należy utworzyć pole SerialVersionUID i przypisać mu wartość. Musi być typu długiego, statycznego i końcowego. Sugeruje się jawne zadeklarowanie pola serialVersionUID w klasie i ustawienie go również jako prywatnego. Na przykład:

Logika pierwszego rzędu
 private static final long serialVersionUID=1L; 

Teraz klasa Serializable będzie wyglądać następująco:

Pracownik.java

 import java.io.Serializable; class Employee implements Serializable{ private static final long serialVersionUID=1L; int id; String name; public Student(int id, String name) { this.id = id; this.name = name; } }