Серіалізація на Java

Серіалізація в Java - це механізм, який перетворює стан об'єкта в потік байтів. Десеріалізація - це її зворотний процес. За допомогою десеріалізації з потоку байтів в пам'яті створюється власне об’єкт Java. Такий механізм зберігає об’єкт.

Потік байтів, створений внаслідок серіалізації, не залежить від будь-якої платформи. Об'єкт, серіалізований на одній платформі, може бути десеріалізований на будь-якій іншій платформі без жодних проблем. Таким чином, весь процес серіалізації та десеріалізації є незалежним JVM.

Якщо об’єкт класу має бути серіалізований, тоді потрібно реалізувати інтерфейс java.io.Serializable. Serializable in java - це маркерний інтерфейс. У ньому немає полів чи методів реалізації. Цей процес робиться серіалізаційним за допомогою цього процесу, який виглядає як процес Opt-In.

Серіалізація в Java реалізується двома класами ObjectInputStream та ObjectOutputStream.

Все, що потрібно, - це обгортка над ними, щоб її можна було зберегти у файл або відправити по мережі.

Поняття серіалізації в Java

Клас ObjectOutputStream, який є класом серіалізації, як згадувалося вище, містить декілька методів запису для запису різних типів даних, але один із методів є найбільш популярним

public final void writeObject(Object x) throws IOException

Вищеописаний метод може бути використаний для серіалізації об'єкта. Цей метод також відправляє його у вихідний потік. Таким же чином клас ObjectInputStream містить метод десеріалізації об'єкта

public final Object readObject() throws IOException, ClassNotFoundException

Метод десеріалізації витягує об'єкт із потоку і деріаріалізує той самий. Повернене значення знову є об'єктом, тому все, що потрібно, - це передати його відповідному типу даних.

Для успішної серіалізації класу необхідно виконати дві умови -

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

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

Слід зауважити, що при серіалізації об’єкта у файл стандартною практикою є надання файлу розширення .ser.

Спосіб серіалізації в Java

Якщо ці методи присутні в класі, вони використовуються для серіалізації в цілях Java.

Метод Опис
public final void writeObject (Object obj) кидає IOException ()Це запише вказаний об'єкт у ObjectOutputStream.
public void flush () кидає IOException ()Це змиє поточний вихідний потік.
public void close () кидає IOException ()Це закриє поточний вихідний потік.

Спосіб десеріалізації в Java

Метод Опис
публічний кінцевий Object readObject () кидає IOException, ClassNotFoundException ()Це прочитає об’єкт із вхідного потоку.
public void close () кидає IOException ()Це закриє ObjectInputStream.

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

У цьому розділі ми обговорили серіалізацію на Java з прикладами.

Тут наведено приклад на Java, який демонструє, як працює серіалізація в Java. Ми створюємо клас Співробітник, щоб вивчити деякі функції, і код на них наведено нижче. Цей клас працівників реалізує інтерфейс 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);
)
)

Коли ця програма буде виконана з виконанням, буде створений файл на ім'я служитель.ser. Ця програма не забезпечує гарантованого результату, скоріше лише для пояснювальних цілей, а мета - зрозуміти її використання та роботу.

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

Нижче описана програма DeserializeDemo десеріалізує вищевказаний об'єкт Employee, створений у програмі 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);
)
)

Вищевказаний код дасть такий результат -

Вихід

Десеріалізований працівник…

Ім'я: Рахул Джайн

Адреса: epip, Бангалор

SSN: 0

Номер: 131

Нижче наведено деякі важливі моменти, пов’язані з програмою вище -

  • Блок спробу / лову вище намагається зловити ClassNotFoundException. Це оголошено методом readObject ().
  • JVM може дезаріалізувати об'єкт, лише якщо він знайде байт-код для класу.
  • Якщо JVM не знайде клас під час десеріалізації, він викине ClassNotFoundException.
  • повернене значення readObject () завжди приводиться до посилання працівника.
  • Значення поля SSN спочатку було 114433, коли об'єкт був серіалізований, але оскільки це значення не було відправлено у вихідний потік. Через те саме, деріаріалізований об'єкт поля SSN співробітника дорівнює 0.

Висновок

Вище ми ввели поняття серіалізації та надали приклади. Давайте зрозуміємо необхідність серіалізації як наші заключні зауваження.

  • Спілкування: Якщо двом машинам, які працюють з одним кодом, потрібно повідомити простий вихід - одна машина повинна створити об'єкт, що містить інформацію, яку він передаватиме, а потім серіалізувати цей об'єкт перед тим, як відправити його на іншу машину. Не чудовий метод, але це робить роботу.
  • Наполегливість: Якщо стан роботи потрібно зберігати в базі даних, він спочатку серіалізується в байтовий масив, а потім зберігається в базі даних для подальшого пошуку.
  • Глибока копія: Якщо потрібно створити точну копію Об'єкта, а також записати спеціалізований клас клонів - це занадто велика праця, тоді лише серіалізуючи об'єкт і потім десертуючи його на інший об'єкт, ви зможете досягти мети.
  • Поперечна синхронізація JVM: різні JVM, що працюють на різних машинах та архітектурах, можна синхронізувати.

Рекомендовані статті

Це було керівництвом щодо серіалізації на Java. Тут ми з прикладами обговорили різні методи серіалізації на Java. Ви також можете переглянути наступну статтю, щоб дізнатися більше -

  1. Питання щодо інтерв'ю для розробника Java
  2. Список Java проти списку масивів
  3. Використання JavaScript