
Серіалізація на 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. Ви також можете переглянути наступну статтю, щоб дізнатися більше -
- Питання щодо інтерв'ю для розробника Java
- Список Java проти списку масивів
- Використання JavaScript