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

Сериализация это процесс сохранения состояния объекта в последовательность байт; десериализация это процесс восстановления объекта, из этих байт. Java Serialization API предоставляет стандартный механизм для создания сериализуемых объектов.

Как сериализовать объект?

Реализовать интерфейс java.io.Serializable. Это интерфейс-маркер;

Листинг 1.

import java.io.Serializable;
class TestSerial implements Serializable {
  public byte version = 100;
  public byte count = 0;
}

Следующим шагом будет фактическая сериализация объекта.

Она делается вызовом методаwriteObject() класса java.io.ObjectOutputStream.

Листинг 2.
public static void main(String args[]) throws IOException {
  FileOutputStream fos = new FileOutputStream("temp.out");
  ObjectOutputStream oos = new ObjectOutputStream(fos);
  TestSerial ts = new TestSerial();
  oos.writeObject(ts);
  oos.flush();
  oos.close();
}

Для воссоздания объекта из файла

Листинг 3.

public static void main(String args[]) throws IOException {
  FileInputStream fis = new FileInputStream("temp.out");
  ObjectInputStream oin = new ObjectInputStream(fis);
  TestSerial ts = (TestSerial) oin.readObject();
  System.out.println("version="+ts.version);
}

Восстановление объекта происходит с помощью вызова метода oin.readObject(). В методе происходит чтение набора байт из файла и создаие точной копии графа оригинального объекта. oin.readObject() может прочитать любой сериализованный объект, поэтому необходимо полученный объект приводить к конкретному типу.

Алгоритм сериализации Java

Алгоритм сериализации делает следующие вещи:

    • запись метаданных о классе ассоциированном с объектом
    • рекурсивная запись описания суперклассов, до тех пор пока не будет достигнут java.lang.object
    • после окончания записи метаданных начинается запись фактических данных ассоциированных с экземпляром, только в этот раз начинается запись с самого верхнего суперкласса
    • рекурсивная запись данных ассоциированных с экземпляром начиная с самого низшего суперкласса

Файл содержит в себе не только запись значений переменных, но полностью название класса, переменных и их значения, а также ту же информацию для всех родителей (подробнее смотри в источнике).

https://habrahabr.ru/post/60317/