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

Сериализация (в программировании) — процесс перевода структуры данных в оперативной/постоянной памяти в последовательность битов, байтов, слов, символов или других кодовых единиц. Обратной к операции сериализации является операция десериализации (структуризации) — создание структуры данных из битовой последовательности.

Сериализация используется для передачи объектов по сети и для сохранения их в файлы. Например, нужно создать распределённое приложение, разные части которого должны обмениваться данными со сложной структурой. В таком случае для типов данных, которые предполагается передавать, пишется код, который осуществляет сериализацию и десериализацию. Объект заполняется нужными данными, затем вызывается код сериализации, в результате получается, например, XML-документ. Результат сериализации передаётся принимающей стороне по, скажем, электронной почте или HTTP. Приложение-получатель создаёт объект того же типа и вызывает код десериализации, в результате получая объект с теми же данными, что были в объекте приложения-отправителя. По такой схеме работает, например, сериализация объектов через SOAP в Microsoft .NET.

Формат сериализации

В простейших случаях сериализация — это просто передача участка памяти «как есть». Например, таблицу из 1000 четырёхбайтовых дробных можно сериализовать, просто передав эти 4000 байтов один за другим по сети или на диск. Но не всегда такое возможно, продуманные форматы сериализации решают такие задачи.

  • Абстракция от формата хранения в памяти — например, машины с порядком байтов Intel и Motorola договариваются передавать в формате Motorola.
  • Исключение факторов вне контроля программиста. Основные из таких факторов — адреса в памяти и неинициализированные (содержащие неизвестно что) байты. Например, если таблица сделана как 16 динамических массивов по 64 штуки (так работает, например, std::deque), то её сериализация должна содержать только данные, но не адреса в ОЗУ — а последние неинициализированные 24 ячейки не передавать.
  • Расширяемость — а что, если таблица не из 1000 чисел? Для этого перед массивом можно передавать заголовок.
  • Контроль человеческих и компьютерных ошибок. Чтобы случайно не подали в программу посторонние данные, формат содержит сигнатуру в начале, а чтобы проверить работу ненадёжной магнитной ленты — контрольную сумму в конце.
  • Обработка вручную и посторонним ПО — для этого таблицу можно передать в виде CSV.
  • Возможность загружать данные простым последовательным чтением цепочки байтов, без возвратов назад, если сериализованные данные не умещаются в память, сжаты, находятся на магнитной ленте, идёт передача в реальном времени и т. д.
  • Реже бывает и обратная задача — имеется прямой доступ к сериализованным данным, нужно делать частичные выборки на манер базы данных.
  • Сжатие данных — типичным примером является Punycode, сериализующий короткую юникодную строку в цепочку печатаемых ASCII-символов с прицелом на краткость представления.
  • Ограничения среды передачи, совместимость — и здесь примером является Punycode, предназначенный в первую очередь для доменной системы интернета, содержащей очень ограниченный набор символов (буквы, цифры и дефис).
  • Возможность вести ограниченную обработку данных, не десериализуя — так работают форматы Юникода UTF-8 и UTF-16. UTF-8 позволяет без десериализации работать с символами ASCII, а UTF-16 — с символами большинства живых языков мира.

Применение

Любой из схем сериализации присуще то, что кодирование данных последовательно по определению, и извлечение любой части сериализованной структуры данных требует, чтобы весь объект был считан от начала до конца и воссоздан. Во многих приложениях такая линейность полезна, потому что позволяет использовать простые интерфейсы ввода-вывода общего назначения для сохранения и передачи состояния объекта. В приложениях, где важна высокая производительность, может иметь смысл использовать более сложную, нелинейную, организацию хранения данных.

Сериализация предоставляет несколько полезных возможностей:

Для наиболее эффективного использования этих возможностей необходимо поддерживать независимость от архитектуры. Например, необходимо иметь возможность надёжно воссоздавать сериализованный поток данных независимо от порядка байтов, использующегося в данной архитектуре. Это значит, что наиболее простая и быстрая процедура прямого копирования участка памяти, в котором размещается структура данных, не может работать надёжно для всех архитектур. Сериализация структур данных в архитектурно-независимый формат означает, что не должно возникать проблем из-за различного порядка следования байт, механизмов распределения памяти или различий представления структур данных в языках программирования.

Недостатки

Сериализация нарушает непрозрачность абстрактного типа данных, потенциально раскрывая частные детали реализации. Тривиальные реализации, которые сериализуют все элементы данных, могут нарушать инкапсуляцию.

Чтобы озадачить конкурентов в плане создания аналогичных продуктов, разработчики патентованного программного обеспечения часто держат детали форматов сериализации своих программ в секрете. Некоторые намеренно запутывают или даже шифруют сериализованные данные. Тем не менее, совместимость требует, чтобы приложения могли понимать форматы сериализации друг друга. Поэтому архитектуры удаленного вызова методов, такие как CORBA, детально задают свои форматы сериализации.

Сериализация научных данных

Для научных наборов данных, имеющих большой объём, таких как данные, получаемые от спутников, или численные модели климата, погоды и океанов, были разработаны специальные бинарные стандарты сериализации, например HDF, netCDF и более старый GRIB.

См. также

Ссылки

Prefix: a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9

Portal di Ensiklopedia Dunia

Kembali kehalaman sebelumnya