- Серіалізація
- Серіалізований інтерфейс
- Приклад серіалізації
- Приклад десеріалізації
- Серіалізація з успадкуванням
- Зовнішній інтерфейс
- Серіалізація та статичний елемент даних
Серіалізація в Java є механізмом запис стану об'єкта в потік байтів . В основному використовується в технологіях Hibernate, RMI, JPA, EJB і JMS.
Зворотна операція серіалізації називається десеріалізація де потік байтів перетворюється на об'єкт. Процес серіалізації та десеріалізації не залежить від платформи, це означає, що ви можете серіалізувати об’єкт на одній платформі та десеріалізувати його на іншій платформі.
дата машинопису
Для серіалізації об’єкта ми називаємо writeObject() метод ObjectOutputStream клас, а для десеріалізації ми називаємо readObject() метод ObjectInputStream клас.
Ми повинні реалізувати Серіалізований інтерфейс для серіалізації об'єкта.
Переваги серіалізації 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 пропонує два методи:
Ключове слово 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; } }