Статья опубликована в рамках: Научного журнала «Студенческий» № 22(66)
Рубрика журнала: Информационные технологии
Скачать книгу(-и): скачать журнал часть 1, скачать журнал часть 2, скачать журнал часть 3, скачать журнал часть 4, скачать журнал часть 5
РАЗРАБОТКА СЕРИАЛИЗАТОРА НА ЯЗЫКЕ ПРОГРАММИРОВАНИЯ JAVASCRIPT
Сериализация
Сериализация (Serialization) — это процесс, который переводит объект в последовательность байтов, по которой затем его можно полностью восстановить. Зачем это нужно? Дело в том, при обычном выполнении программы максимальный срок жизни любого объекта известен — от запуска программы до ее окончания.
Многие знают о сериализации в языке выского уровня JAVA, ее суть, как было сказано выше – передача данных между сериализуемыми классами и сохранение данных в последовательности байтов.
В большинстве веб-проектов в 00-х годах использовали сериализацию в JAVA для загрузки и выгрузки данных с сервера. Это было удобно, т.к. существовали соответствующие надстройки прямо в браузере, которые поддерживали выполнения сериализуемых данных в клиентских приложениях.
У JAVA сериализации были свои проблемы, и было их достаточно, начиная с отсутсвия безопасности при передачи данных, заканчивая медленной работы самого сериализатора и передача больших объектов занимала больше времяни.
Эта проблема меня заинтересовала, ведь до сих пор функционируют старые проекты, которые опираются на JAVA-сериализацию. И я, как JS-разработчик решил написать свой сериализатор на JS для передачи данных на сервер.
Реализация сериализатора
Сперва решим как именно объект будет записываться в поток данных. Это нам поможет сделать метод charCodeAt().Метод charCodeAt() возвращает числовое значение Юникода для символа по указанному индексу (за исключением кодовых точек Юникода, больших 0x10000).
![]()
Рисунок 1. Метод charCodeAt()
Дальше встает вопрос о сохранении файла с данными из потока. Для этого мы будем использовать объект Blob.
Объект Blob представляет из себя объект наподобие файла с неизменяемыми, необработанными данными. Blob-ы представляют данные, которые могут быть не в родном формате JavaScript. Интерфейс File основан на Blob, наследует функциональность Blob и расширяет его для поддержки файлов на стороне пользователя.
Напишем функцию сохранения объекта:

Рисунок 2. функция сохранения объекта saveByteArray
Разобрав первостепенные задачи начнем реализовывать сам алгоритм сериализации. Ниже представлен объект, аналогичный тому, который необходимо передать в потом на сервер ИС e-Net.

Рисунок 3. объект Exampleobject
Этот объект имеет два поля class и data. В поле class будет хранится информация о классах внутри этого объекта. Как было сказано выше, у любого класса есть свой serialVersionUID. Это идентификатор класса в JAVA, используемый при сериализации с использованием стадартного алгоритма. Хранится как числовое значение типа long.
Так как метод charCodeAt() работает с типами данных не больше integer 216 – максимильное значение - 65535. Пришлось разделить serialVersionUID на две части, первая записывается в 4 байта – serialVersionUIDH, а вторая в последние 4 байта – serialVersionUIDL.
В поле fields могут храниться различные данные (примитивы, массив, другие объекты и их типы).
Обратясь к спецификации JAVA по сериализации мы найдем последовательность заполняемых данных при сериализации.

Для начала реализуем magic version и contents с помощью метода push мы будем отпралять данные в наш массив.

Рисунок 4. Oтправка данных в массив
Дальше попробуем записать класс в наш поток данных. Последовательность обозначения класса в сериализации представлена ниже:

TC_CLASSDESC – представляет собой флаг, который говорит, что следующий элемент в записи будет классом и соответсвующе его маркирует.

Рисунок 5. Запись класса в массив средствами JS
После присвоения флага класса следует его имя. Отправляются в параметры objectClass.name – ссылка на имя объекта класса. И вызовем функцию writeString, которая будет записывать строковые данные в массив.

Рисунок 6. Функция writeString
По нотации JAVA сериализации перед именем класса должно быть значение равное длине имени класса. За это отвечает функция writeShort.

Рисунок 7. Функция writeShort
С помощью этих функций получилось написать имя класса объекта и дессериализовать его в среде разработки Eclipse.
![]()
Таким образом, я смог написать простенькую функцию сериализации, которую можно десереализовать в среде разработки, которая будет поддерживать JAVA – например, Eclipse.
Список литературы:
- JS разработка - https://developer.mozilla.org (дата обращения 06.05.19)Спецификация Java Serialize - https://docs.oracle.com/javase/7/docs/platform/serialization/spec/protocol.html (дата обращения 06.05.19)


Оставить комментарий