Сериализация в 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
- после окончания записи метаданных начинается запись фактических данных ассоциированных с экземпляром, только в этот раз начинается запись с самого верхнего суперкласса
- рекурсивная запись данных ассоциированных с экземпляром начиная с самого низшего суперкласса
Файл содержит в себе не только запись значений переменных, но полностью название класса, переменных и их значения, а также ту же информацию для всех родителей (подробнее смотри в источнике).