logo

Серіалізація та десеріалізація в Java

  1. Серіалізація
  2. Серіалізований інтерфейс
  3. Приклад серіалізації
  4. Приклад десеріалізації
  5. Серіалізація з успадкуванням
  6. Зовнішній інтерфейс
  7. Серіалізація та статичний елемент даних

Серіалізація в Java є механізмом запис стану об'єкта в потік байтів . В основному використовується в технологіях Hibernate, RMI, JPA, EJB і JMS.

Зворотна операція серіалізації називається десеріалізація де потік байтів перетворюється на об'єкт. Процес серіалізації та десеріалізації не залежить від платформи, це означає, що ви можете серіалізувати об’єкт на одній платформі та десеріалізувати його на іншій платформі.

дата машинопису

Для серіалізації об’єкта ми називаємо writeObject() метод ObjectOutputStream клас, а для десеріалізації ми називаємо readObject() метод ObjectInputStream клас.

Ми повинні реалізувати Серіалізований інтерфейс для серіалізації об'єкта.

Переваги серіалізації Java

Він в основному використовується для переміщення стану об’єкта в мережі (це відоме як маршалінг).

серіалізація java

java.io.Serializable інтерфейс

Серіалізований є інтерфейсом маркера (не має члена даних і методу). Він використовується для «позначення» класів Java, щоб об’єкти цих класів могли отримати певні можливості. The Можливість клонування і Дистанційний також є маркерними інтерфейсами.

The Серіалізований інтерфейс повинен бути реалізований класом, об'єкт якого потрібно зберегти.

Клас String і всі класи-огортки реалізують java.io.Serializable інтерфейс за замовчуванням.

Розглянемо наведений нижче приклад:

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; } } 

У наведеному вище прикладі студент клас реалізує інтерфейс Serializable. Тепер його об'єкти можна конвертувати в потік. Реалізація основного класу показано в наступному коді.

Клас ObjectOutputStream

Клас ObjectOutputStream використовується для запису примітивних типів даних і об’єктів Java у OutputStream. Лише об’єкти, які підтримують інтерфейс java.io.Serializable, можуть бути записані в потоки.

Конструктор

1) public ObjectOutputStream(OutputStream out) викидає IOException {}Він створює ObjectOutputStream, який записує в указаний OutputStream.

Важливі методи

методопис
1) public final void writeObject(Object obj) викидає IOException {}Він записує вказаний об’єкт у ObjectOutputStream.
2) public void flush() створює IOException {}Він очищає поточний вихідний потік.
3) public void close() викидає IOException {}Він закриває поточний вихідний потік.

Клас ObjectInputStream

ObjectInputStream десеріалізує об’єкти та примітивні дані, записані за допомогою ObjectOutputStream.

Конструктор

для кожного машинопису
1) публічний ObjectInputStream(InputStream in) викидає IOException {}Він створює ObjectInputStream, який читає з указаного InputStream.

Важливі методи

г шльопанець
методопис
1) public final Object readObject() викидає IOException, ClassNotFoundException{}Він читає об'єкт із вхідного потоку.
2) public void close() створює IOException {}Він закриває ObjectInputStream.

Приклад серіалізації Java

У цьому прикладі ми збираємося серіалізувати об’єкт студент клас із коду вище. Метод writeObject() класу ObjectOutputStream надає функціональні можливості для серіалізації об’єкта. Ми зберігаємо стан об'єкта у файлі з ім'ям 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);} } } 

Вихід:

 success 
завантажити цей приклад серіалізації

Приклад десеріалізації Java

Десеріалізація — це процес реконструкції об’єкта з серіалізованого стану. Це операція, зворотна серіалізації. Давайте розглянемо приклад, де ми читаємо дані з десеріалізованого об’єкта.

Десеріалізація — це процес реконструкції об’єкта з серіалізованого стану. Це операція, зворотна серіалізації. Давайте розглянемо приклад, де ми читаємо дані з десеріалізованого об’єкта.

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

Вихід:

211 ravi 
завантажте цей приклад десеріалізації

Серіалізація Java із успадкуванням (зв’язок IS-A)

Якщо клас реалізує Серіалізований інтерфейс тоді всі його підкласи також можна буде серіалізувати. Розглянемо наведений нижче приклад:

Серіалізація ISA.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);} } } 

Вихід:

 success 211 ravi Engineering 50000 

Клас SerializeISA серіалізував об’єкт класу Student, який розширює клас Person, який є Serializable. Властивості батьківського класу успадковуються підкласами, тому, якщо батьківський клас є серіалізованим, підклас також буде таким.

Серіалізація Java з агрегацією (зв’язок HAS-A)

Якщо клас має посилання на інший клас, усі посилання мають бути серіалізованими, інакше процес серіалізації не виконуватиметься. У такому випадку NotSerializableException кидається під час виконання.

угода про імена java

Адреса.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; } } 

Оскільки Address не можна серіалізувати, ви не можете серіалізувати екземпляр класу Student.

Примітка. Усі об’єкти в об’єкті мають бути серіалізованими.

Серіалізація Java зі статичним елементом даних

Якщо в класі є будь-який статичний член даних, він не буде серіалізований, оскільки static є частиною класу, а не об’єктом.

Employee.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; } } 

Серіалізація Java з масивом або колекцією

Правило: у випадку масиву чи колекції всі об’єкти масиву чи колекції мають бути серіалізованими. Якщо будь-який об’єкт не можна серіалізувати, серіалізація буде невдалою.

Можливість екстерналізації в java

Інтерфейс Externalizable надає можливість записувати стан об’єкта в потік байтів у форматі стиснення. Це не інтерфейс маркера.

Інтерфейс Externalizable пропонує два методи:

    public void writeExternal(ObjectOutput out) створює IOException public void readExternal(ObjectInput in) створює IOException

Ключове слово Java Transient

Якщо ви не хочете серіалізувати будь-який член даних класу, ви можете позначити його як тимчасовий.

Employee.java

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

Тепер id не буде серіалізовано, тому, коли ви десеріалізуєте об’єкт після серіалізації, ви не отримаєте значення id. Він завжди повертатиме значення за умовчанням. У такому випадку він поверне 0, оскільки тип даних id є цілим числом.

Відвідайте наступну сторінку, щоб дізнатися більше.

SerialVersionUID

Процес серіалізації під час виконання пов’язує ідентифікатор з кожним класом Serializable, який відомий як SerialVersionUID. Він використовується для перевірки відправника та одержувача серіалізованого об’єкта. Відправник і одержувач мають бути однаковими. Для його перевірки використовується SerialVersionUID. Відправник і одержувач повинні мати однаковий SerialVersionUID, інакше InvalidClassException буде видано, коли ви десеріалізуєте об'єкт. Ми також можемо оголосити наш власний SerialVersionUID у класі Serializable. Для цього вам потрібно створити поле SerialVersionUID і призначити йому значення. Він повинен бути довгого типу зі статичним і кінцевим. Пропонується явно оголосити поле serialVersionUID у класі та зробити його приватним. Наприклад:

 private static final long serialVersionUID=1L; 

Тепер клас Serializable виглядатиме так:

Employee.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; } }