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

Сериализация в Java - это механизм, который преобразует состояние объекта в поток байтов. Десериализация - это обратный процесс. Посредством десериализации из потока байтов фактический объект Java создается в памяти. Такой механизм сохраняется объект.

Поток байтов, созданный в результате сериализации, не зависит от какой-либо платформы. Объект, сериализованный на одной платформе, может быть десериализован на любой другой платформе без каких-либо проблем. Таким образом, весь процесс сериализации и десериализации не зависит от JVM.

Если объект класса должен быть сериализован, необходимо реализовать интерфейс java.io.Serializable. Сериализуемым в 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

метод Описание
public final Object readObject () генерирует IOException, ClassNotFoundException ()Это будет читать объект из входного потока.
public void close () генерирует IOException ()Это закроет ObjectInputStream.

Примеры сериализации в Java

В этом разделе мы обсудили сериализацию в Java с примерами.

Здесь приведен пример в Java, чтобы продемонстрировать, как сериализация работает в Java. Мы создаем класс Employee для изучения некоторых функций, и код для них приведен ниже. Этот класс сотрудников реализует интерфейс 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);
)
)

Когда эта программа будет завершена с выполнением, будет создан файл с именем employee.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);
)
)

Приведенный выше код даст следующий результат -

Выход

Десериализованный сотрудник…

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

Адрес: эпип, Бангалор

SSN: 0

Количество: 131

Некоторые важные моменты, связанные с программой выше, приведены ниже -

  • Приведенный выше блок try / catch пытается перехватить исключение ClassNotFoundException. Это объявляется методом readObject ().
  • JVM может десериализовать объект, только если он находит байт-код для класса.
  • Если JVM не найдет класс во время десериализации, она выдаст исключение ClassNotFoundException.
  • возвращаемое значение readObject () всегда приводится к ссылке Employee.
  • Значение поля SSN изначально было 114433, когда объект был сериализован, но это значение не было отправлено в выходной поток. Вследствие этого десериализованный объект поля SSN сотрудника имеет значение 0.

Вывод

Выше мы представили концепции сериализации и предоставили примеры. Давайте поймем необходимость сериализации в качестве наших заключительных замечаний.

  • Обмен данными : если двум машинам, работающим с одним и тем же кодом, необходимо обмениваться данными, простой выход состоит в том, что один компьютер должен создать объект, содержащий информацию, которую он будет передавать, а затем сериализовать этот объект перед отправкой на другой компьютер. Не отличный метод, но выполняет свою работу.
  • Постоянство: если состояние операции должно храниться в базе данных, оно сначала сериализуется в байтовый массив, а затем сохраняется в базе данных для последующего извлечения.
  • Глубокая Копия: Если точная копия Объекта должна быть создана, и написание специализированного класса клона является слишком большой работой, тогда только сериализация объекта и затем десериализация его к другому объекту достигнет цели.
  • Перекрестная синхронизация JVM: различные JVM, работающие на разных машинах и архитектурах, могут быть синхронизированы.

Рекомендуемые статьи

Это было руководство по сериализации в Java. Здесь мы обсудили различные методы сериализации в Java с примерами. Вы также можете посмотреть следующую статью, чтобы узнать больше -

  1. Интервью с Java-разработчиками
  2. Список Java и список массивов
  3. Использование JavaScript