Статья опубликована в рамках: Научного журнала «Студенческий» № 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)
Оставить комментарий