Сериализация в Java

Сериализацията в Java е механизъм, който преобразува състоянието на обекта в байтов поток. Десериализацията е неговият обратен процес. Чрез десериализацията от байтов поток в паметта се създава действителен Java обект. Такъв механизъм персистира обекта.

По този начин байтовият поток, създаден от сериализацията, не зависи от всяка платформа. Обектът, сериализиран на една платформа, може да се десериализира на всяка друга платформа без никакъв проблем. По този начин целият процес на сериализация и десериализация е независим от JVM.

Ако трябва да се сериализира обект от клас, тогава трябва да се реализира интерфейса java.io.Serializable. Serializable in java е маркерен интерфейс. Тя няма полета или методи за изпълнение. Класът се сериализира чрез този процес, който прилича на процес на оптимизиране.

Сериализацията в 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);
)
)

Когато тази програма ще бъде извършена с изпълнение, ще бъде създаден файл на име служител.сер. Тази програма не осигурява гарантиран резултат, по-скоро е само с обяснителна цел и целта е да се разбере нейното използване и работа.

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

По-долу са дадени някои важни точки, свързани с програмата по-горе -

  • Блокът try / catch по-горе се опитва да улови ClassNotFoundException. Това се декларира чрез метода readObject ().
  • JVM може да десериализира обект, само ако намери байтовия код за класа.
  • Ако JVM не намери клас по време на десериализацията, той ще хвърли ClassNotFoundException.
  • връщащата се стойност на readObject () винаги се предава на справка на служителя.
  • Първоначално стойността на SSN полето е 114433, когато обектът е сериализиран, но тъй като тази стойност не е изпратена до изходния поток. Поради същото, десериализираният полев обект SSN на служителя е 0.

заключение

По-горе въведохме концепции за сериализация и предоставихме примери. Нека да разберем необходимостта от сериализация като нашите заключителни бележки.

  • Комуникация: Ако две машини, които работят с един и същ код, трябва да съобщят лесния изход е, че една машина трябва да изгради обект, съдържащ информация, която би предавала, и след това да сериализира този обект, преди да го изпрати на другата машина. Не е страхотен метод, но върши работата.
  • Устойчивост: Ако състоянието на работа трябва да се съхранява в база данни, първо се сериализира в байтов масив и след това се съхранява в базата данни за извличане в по-късен момент.
  • Дълбоко копиране: Ако трябва да се създаде точна реплика на даден обект и да се напише специализиран клас клониране е твърде тежък труд, тогава само сериализиране на обекта и след това десериализиране на друг обект ще постигне целта.
  • Кръстосана синхронизация на JVM: различни JVM файлове, работещи на различни машини и архитектури, могат да бъдат синхронизирани.

Препоръчителни статии

Това е ръководство за сериализация в Java. Тук сме обсъдили различните примери за сериализация в Java с примери. Можете също да разгледате следната статия, за да научите повече -

  1. Въпроси за интервю за Java Developer
  2. Java List vs Array List
  3. Използване на JavaScript