Анализ алгоритма сериализации Java
Сериализация — это процесс описания объекта как серии байтов, десериализация — это процесс преобразования этих байтов в объект; API сериализации Java предоставляет стандартный механизм обработки сериализации объектов. Здесь вы можете узнать, как сериализовать объект, когда сериализация требуется, и алгоритм сериализации Java. Мы используем пример, чтобы продемонстрировать, как байты после сериализации описывают информацию об объекте.
Необходимость сериализации
В Java все является объектом. В распределенной среде часто необходимо передавать объекты из одной сети или устройства в другую. Для этого требуется протокол, который может передавать данные на обоих концах. Для решения этой проблемы был создан механизм сериализации Java.
Как сериализовать объект
Предварительным условием для сериализуемости объекта является реализация интерфейса Serializable. Интерфейс Serializable не имеет методов и больше похож на маркер. Классы с этим тегом могут обрабатываться механизмом сериализации.
100.
Формат сериализации объекта
Как выглядит объект после сериализации? Откройте файл temp.out, который мы только что сериализовали и вывели объект, и отобразите его в шестнадцатеричном формате. Содержание должно быть следующим:
73 74 A0 0C 34 00 FE B1 DD F9 02 00 02 42 00 05
63 6Ф 75 6Е 74 42 00 07 76 65 72 73 69 6Ф 6Е 78
70 00 64
общедоступная версия байта = 100;
количество общедоступных байтов = 0;
Оба имеют байтовый тип. Теоретически для хранения этих двух полей необходимо всего 2 байта, но на самом деле temp.out занимает 51 байт, а это значит, что помимо данных в него входят и другие описания сериализуемого объекта.
Алгоритм сериализации Java
Алгоритм сериализации обычно выполняет следующие шаги:
◆Вывод метаданных класса, связанных с экземплярами объектов.
◆Рекурсивно выводить описание суперкласса класса до тех пор, пока суперклассов не останется.
◆После завершения метаданных класса фактические значения данных экземпляра объекта выводятся, начиная с суперкласса верхнего уровня.
◆Рекурсивный вывод данных экземпляра сверху вниз.
Проиллюстрируем еще одним примером, более полно охватывающим все возможные ситуации:
класс содержит реализацию Serializable{
INT содержитВерсия = 11;
}
публичный класс SerialTest расширяет родительские реализации Serializable {
int версия = 66;
содержать con = новый содержащий();
общественный int getVersion() {
обратная версия;
}
public static void main(String args[]) выдает IOException {
FileOutputStream fos = новый FileOutputStream("temp.out");
ObjectOutputStream oos = новый ObjectOutputStream (fos);
SerialTest st = новый SerialTest();
оос.writeObject(ст);
оос.флеш();
оос.закрыть();
}
}
Сериализованный формат следующий:
AC ED 00 05 7372 00 0A 53 65 72 69 61 6C 54 65
73 74 05 52 81 5A AC 66 02 F6 02 00 0249 00 07
76 65 72 73 69 6F 6E4C00 03 63 6F 6E74 00 09
4C63 6F 6E 74 61 69 6E 3B 7872 00 06 70 61 72
65 6E 74 0E DB D2 BD 85 EE 63 7A 02 00 0149 00
0D 70 61 72 65 6E 74 56 65 72 73 69 6F 6E 78 70
0000000А 0000004273 72 00 07 63 6F 6E 74
61 69 6E FC BB E6 0E FB CB 60 C7 02 00 0149 00
0E 63 6F 6E 74 61 69 6E 56 65 72 73 69 6F 6E 78
700000000Б
Давайте подробнее посмотрим, что представляют собой эти байты. Начало, см. цвет:
Первым шагом алгоритма сериализации является вывод описания связанного с объектом класса. Объект, показанный в примере, является экземпляром класса SerialTest, поэтому описание класса SerialTest выводится следующим. Смотрите цвета:
Далее алгоритм выводит одно из полей, inversion=66 см. цвет:
Затем алгоритм выводит следующий домен: contains con = new contains(), это нечто особенное, это объект. При описании ссылок на типы объектов вам необходимо использовать стандартную нотацию сигнатуры объекта JVM, см. цвет:
.Затем алгоритм выведет описание суперкласса, который является родительским. См. цвет:
Затем выведите описание домена родительского класса, intparentVersion=100, см. также цвет:
На данный момент алгоритм вывел описания всех классов. Следующим шагом является вывод фактического значения объекта экземпляра. В настоящее время он начинается с домена родительского класса, см. цвет:
Также есть поля класса SerialTest:
Следующие байты более интересны. Алгоритм должен описывать информацию содержащего класса. Обратите внимание, что содержащий класс еще не описан. См. цвет:
.Выведите уникальное описание домена contains, intcontainVersion=11;
В это время алгоритм сериализации проверит, есть ли у contains суперкласс, и если да, то выведет его.
Наконец, выводится фактическое значение домена содержащего класса.
Хорошо, мы обсудили механизм и принципы сериализации Java и надеемся, что это будет полезно студентам.