Сериализация - Википедия - Serialization

В вычислениях сериализация (Американское правописание) или сериализация (Английское правописание) - это процесс перевода структура данных или же объект состояние в формат, который можно сохранить (например, в файл или память буфер данных ) или переданы (например, через компьютерная сеть ) и реконструирован позже (возможно, в другой компьютерной среде).[1] Когда результирующая последовательность битов перечитывается в соответствии с форматом сериализации, ее можно использовать для создания семантически идентичного клона исходного объекта. Для многих сложных объектов, например тех, которые широко используют Рекомендации, это непростой процесс. Сериализация объектно-ориентированного объекты не включает ни один из связанных с ними методы с которым они были ранее связаны.

Этот процесс сериализации объекта также называется сортировка объект в некоторых ситуациях.[1][2] Противоположная операция - извлечение структуры данных из серии байтов - это десериализация, (также называемый десериализация или же демаршаллинг).

Использует

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

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

Даже на одной машине примитивный указатель объекты слишком хрупкие для сохранения, поскольку объекты, на которые они указывают, могут быть перезагружены в другое место в памяти. Чтобы справиться с этим, процесс сериализации включает шаг, называемый незабываемый или же указатель немигающий, где прямые указатели преобразуются в ссылки на основе имени или позиции. Процесс десериализации включает в себя обратный шаг, называемый указатель swizzling.

Поскольку как сериализацию, так и десериализацию можно использовать из общего кода (например, Сериализовать функционировать в Классы Microsoft Foundation ), общий код может выполнять и то и другое одновременно, и, таким образом, 1) обнаруживать различия между сериализуемыми объектами и их предыдущими копиями и 2) обеспечивать ввод для следующего такого обнаружения. Фактически создавать предыдущую копию нет необходимости, потому что различия можно обнаружить на лету. Техника называется дифференциальное исполнение. Это полезно при программировании пользовательских интерфейсов, содержимое которых меняется во времени - графические объекты можно создавать, удалять, изменять или заставлять обрабатывать события ввода без необходимости писать отдельный код для выполнения этих действий.

Недостатки

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

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

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

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

В Сетевые системы Xerox Курьерская технология начала 1980-х годов повлияла на первый широко принятый стандарт. Sun Microsystems опубликовал Представление внешних данных (XDR) в 1987 году.[3] XDR - это открытый формат, и стандартизирован как STD 67 (RFC 4506 ).

В конце 1990-х годов началась попытка предоставить альтернативу стандартным протоколам сериализации: XML, SGML подмножество, использовалось для создания удобочитаемого текстовая кодировка. Такое кодирование может быть полезно для постоянных объектов, которые могут быть прочитаны и поняты людьми или переданы другим системам независимо от языка программирования. Его недостаток состоит в том, что он теряет более компактное кодирование, основанное на потоке байтов, но к этому моменту большие объемы хранения и передачи сделали размер файла менее серьезным, чем в первые дни вычислений. В 2000-х годах XML часто использовался для асинхронной передачи структурированных данных между клиентом и сервером в Аякс веб-приложения. XML - это открытый формат, стандартизированный как Рекомендация W3C.

JSON, представляет собой более легкую текстовую альтернативу XML, которая также обычно используется для взаимодействия клиент-сервер в веб-приложениях. JSON основан на Синтаксис JavaScript, но не зависит от JavaScript и также поддерживается другими языками программирования. JSON - это открытый формат, стандартизированный как STD 90 (RFC  8259 ), ECMA-404, и ИСО / МЭК 21778: 2017.

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

Списки недвижимости используются для сериализации Следующий шаг, GNUstep, macOS, и iOS рамки. Список недвижимости, или же p-список для краткости, это относится не к одному формату сериализации, а к нескольким различным вариантам, некоторым удобочитаемым и одному двоичному.

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

Поддержка языков программирования

Несколько объектно-ориентированного программирования языки напрямую поддерживают сериализация объекта (или же архивирование объекта), либо синтаксический сахар элементы или предоставление стандарта интерфейс для этого. Языки, которые это делают, включают Рубин, Болтовня, Python, PHP, Цель-C, Delphi, Ява, а .СЕТЬ семья языков. Также доступны библиотеки, которые добавляют поддержку сериализации для языков, в которых она отсутствует.

C и C ++
C и C ++ не обеспечивают сериализацию как какую-либо конструкцию высокого уровня, но оба языка поддерживают запись любых встроенных типы данных, а также простые старые данные структуры, как двоичные данные. Таким образом, обычно нетрудно написать собственные функции сериализации. Более того, решения на основе компилятора, такие как ODB ORM система для C ++ и gSOAP инструментарий для C и C ++, способны автоматически создавать код сериализации с небольшими изменениями объявлений классов или без них. Другими популярными фреймворками сериализации являются Boost.Serialization.[4] от Boost Framework, фреймворк S11n,[5] и хлопья.[6] Фреймворк MFC (Microsoft) также предоставляет методологию сериализации как часть своей архитектуры Document-View.
CFML
CFML позволяет сериализовать структуры данных в WDDX с <cfwddx> пометить и JSON с SerializeJSON () функция.
Delphi
Delphi предоставляет встроенный механизм для сериализации компонентов (также называемых постоянными объектами), который полностью интегрирован с его IDE. Содержимое компонента сохраняется в файл DFM и перезагружается на лету.
Идти
Идти изначально поддерживает немаршаллинг / маршаллинг JSON и XML данные.[7] Также существуют сторонние модули, поддерживающие YAML.[8]
Haskell
В Haskell сериализация поддерживается для типов, которые являются членами Read и Show типовые классы. Каждый тип, входящий в Читать type class определяет функцию, которая будет извлекать данные из строкового представления выгруженных данных. В Показать type class, в свою очередь, содержит Показать функция, из которой может быть сгенерировано строковое представление объекта. Программисту не нужно определять функции явно - простое объявление типа, производного от Read или от Show, или того и другого, может заставить компилятор сгенерировать соответствующие функции для многих случаев (но не для всех: типы функций, например, не могут автоматически выводить Show или прочтите). Автоматически сгенерированный экземпляр для Show также создает действительный исходный код, поэтому то же значение Haskell может быть сгенерировано путем запуска кода, созданного show, например, в интерпретаторе Haskell.[9] Для более эффективной сериализации существуют библиотеки haskell, которые позволяют выполнять высокоскоростную сериализацию в двоичном формате, например двоичный.
Ява
Java обеспечивает автоматическую сериализацию, которая требует, чтобы объект был отмечен путем реализации java.io.Serializable интерфейс. Реализация интерфейса отмечает класс как «допустимо для сериализации», и Java затем выполняет сериализацию внутри. На странице не определены методы сериализации. Сериализуемый интерфейс, но сериализуемый класс может дополнительно определять методы с определенными специальными именами и подписями, которые, если они определены, будут вызываться как часть процесса сериализации / десериализации. Язык также позволяет разработчику более тщательно переопределять процесс сериализации, реализуя другой интерфейс, Внешний интерфейс, который включает два специальных метода, которые используются для сохранения и восстановления состояния объекта. Есть три основные причины, по которым объекты не сериализуемы по умолчанию и должны реализовывать Сериализуемый интерфейс для доступа к механизму сериализации Java. Во-первых, не все объекты фиксируют полезную семантику в сериализованном состоянии. Например, Нить объект привязан к состоянию текущего JVM. Нет контекста, в котором десериализованный Нить объект будет поддерживать полезную семантику. Во-вторых, сериализованное состояние объекта составляет часть контракта совместимости его классов. Поддержание совместимости между версиями сериализуемых классов требует дополнительных усилий и внимания. Следовательно, создание сериализуемого класса должно быть осознанным дизайнерским решением, а не условием по умолчанию. Наконец, сериализация позволяет получить доступ к не-преходящий закрытые члены класса, которые иначе недоступны. Классы, содержащие конфиденциальную информацию (например, пароль), не должны быть ни сериализуемыми, ни внешними. Стандартный метод кодирования использует рекурсивный графовый перевод дескриптора класса объекта и сериализуемых полей в поток байтов. Примитивы, а также непереходные нестатические объекты, на которые имеются ссылки, кодируются в потоке. Каждый объект, на который ссылается сериализованный объект через поле, не помеченное как преходящий также должны быть сериализованы; и если какой-либо объект в полном графе непереходных ссылок на объекты не может быть сериализован, сериализация завершится ошибкой. Разработчик может повлиять на это поведение, пометив объекты как временные или переопределив сериализацию для объекта, чтобы некоторая часть ссылочного графа была усечена, а не сериализована. Java не использует конструктор для сериализации объектов. Можно сериализовать объекты Java через JDBC и сохранить их в базе данных.[10] Пока Качать компоненты действительно реализуют интерфейс Serializable, их переносимость между различными версиями виртуальной машины Java не гарантируется. Таким образом, компонент Swing или любой компонент, который его наследует, можно сериализовать в поток байтов, но не гарантируется, что это будет преобразовано на другой машине.
JavaScript
Начиная с ECMAScript 5.1,[11] JavaScript включил встроенный JSON объект и его методы JSON.parse () и JSON.stringify (). Хотя JSON изначально основан на подмножестве JavaScript,[12] есть граничные случаи, когда JSON не является допустимым JavaScript. В частности, JSON позволяет Знаки конца строки Unicode U + 2028 СЕПАРАТОР ЛИНИИ и U + 2029 РАЗДЕЛИТЕЛЬ ПАРАГРАФОВ отображаться в кавычках без экранирования, а в ECMAScript 2018 и старше - нет.[13][14] Видеть основная статья о JSON.
Юля
Юля реализует сериализацию через сериализовать () / десериализовать () модули,[15] предназначен для работы с той же версией Julia и / или экземпляром одного и того же образа системы.[16] В HDF5.jl package предлагает более стабильную альтернативу, использующую документированный формат и общую библиотеку с оболочками для разных языков,[17] в то время как формат сериализации по умолчанию, как предполагается, был разработан с учетом максимальной производительности для сетевой связи.[18]
Лисп
Обычно Лисп структуру данных можно сериализовать с помощью функций "читать" и "Распечатать". Переменная foo, содержащая, например, список массивов, будет напечатана (печать foo). Точно так же объект может быть прочитан из потока с именем s с помощью (читать с). Эти две части реализации Лиспа называются принтером и читателем. Выход "Распечатать"читается человеком; в нем используются списки, помеченные круглыми скобками, например: (4 2,9 "x" y). Во многих типах Lisp, включая Common Lisp, принтер не может отображать все типы данных, потому что неясно, как это сделать. Например, в Common Lisp принтер не может печатать объекты CLOS. Вместо этого программист может написать метод для общей функции объект печати, это будет вызвано при печати объекта. Это несколько похоже на метод, используемый в Ruby. Сам код Lisp написан в синтаксисе читателя, который называется синтаксисом чтения. Большинство языков используют отдельные и разные парсеры для работы с кодом и данными, Lisp использует только один. Файл, содержащий код Lisp, может быть прочитан в память как структура данных, преобразован другой программой, а затем, возможно, выполнен или записан, например, в цикл чтения – оценки – печати. Не все читатели / писатели поддерживают циклические, рекурсивные или разделяемые структуры.
.NET Framework
.NET Framework имеет несколько сериализаторов, разработанных Microsoft. Есть также много сериализаторов сторонних производителей. Обсуждается и тестируется более десятка сериализаторов. здесь.[19] и здесь[20] Список постоянно расширяется.
OCaml
OCaml стандартная библиотека обеспечивает маршаллинг через Маршал модуль (его документация ) и функции Pervasives output_value и input_value. Хотя программирование OCaml имеет статическую проверку типов, использование Маршал модуль может нарушить гарантии типа, так как нет способа проверить, представляет ли немаршалированный поток объекты ожидаемого типа. В OCaml сложно маршалировать функцию или структуру данных, которая содержит функцию (например, объект, содержащий метод), потому что исполняемый код в функциях не может передаваться между разными программами. (Есть флаг для маршалинга позиции кода функции, но он может быть демаршалирован только в одной и той же программе). Стандартные функции маршалинга могут сохранять совместное использование и обрабатывать циклические данные, которые можно настроить с помощью флага.
Perl
Несколько Perl модули доступны от CPAN предоставить механизмы сериализации, включая Хранимый , JSON :: XS и FreezeThaw. Storable включает функции для сериализации и десериализации структур данных Perl в файлы или скаляры Perl и из них. Помимо сериализации непосредственно в файлы, Хранимый включает заморозить функция для возврата сериализованной копии данных, упакованных в скаляр, и оттепель десериализовать такой скаляр. Это полезно для отправки сложной структуры данных через сетевой сокет или сохранения ее в базе данных. При сериализации структур с Хранимый, есть сетевые безопасные функции, которые всегда сохраняют свои данные в формате, доступном для чтения на любом компьютере, за небольшую плату. Эти функции называются nstore, nfreezeи т. д. Не существует "n" функций для десериализации этих структур - обычный оттепель и забрать десериализовать структуры, сериализованные с "п"функции и их машинно-зависимые эквиваленты.
PHP
PHP изначально реализована сериализация через встроенный сериализовать () и unserialize () функции.[21] PHP может сериализовать любой из своих типов данных, кроме ресурсов (указатели файлов, сокеты и т. Д.). Встроенный unserialize () функция часто опасна при использовании с полностью ненадежными данными.[22] Для объектов есть два "магия методы ", которые могут быть реализованы внутри класса - __спать() и __просыпайся() - которые вызываются изнутри сериализовать () и unserialize ()соответственно, которые могут очищать и восстанавливать объект. Например, может быть желательно закрыть соединение с базой данных при сериализации и восстановить соединение при десериализации; эта функциональность будет обрабатываться этими двумя волшебными методами. Они также позволяют объекту выбирать, какие свойства сериализованы. Начиная с PHP 5.1, существует объектно-ориентированный механизм сериализации для объектов, Сериализуемый интерфейс.[23]
Пролог
Пролог с срок структура, которая является единственной структурой данных языка, может быть сериализована с помощью встроенного предиката write_term / 3 и сериализован через встроенные предикаты читать / 1 и read_term / 2. Результирующий поток представляет собой несжатый текст (в некоторой кодировке, определяемой конфигурацией целевого потока), с любыми свободными переменными в термине, представленными именами переменных-заполнителей. Предикат write_term / 3 стандартизирован в Спецификация ISO для Prolog (ISO / IEC 13211-1) на страницах 59 и далее. («Написание термина, § 7.10.5»). Поэтому ожидается, что термины, сериализованные в одной реализации, могут быть преобразованы в другую без двусмысленности или неожиданностей. На практике расширения, зависящие от реализации (например, словари SWI-Prolog), могут использовать нестандартные структуры терминов, поэтому совместимость может нарушаться в крайних случаях. В качестве примеров см. Соответствующие страницы руководства для SWI-Prolog.[24], SICStus Prolog[25], GNU Prolog.[26] Вопрос о том, проверяются ли сериализованные термины, полученные по сети, на соответствие спецификации (после того, как десериализация из символьного потока произошла), и каким образом, остается на усмотрение разработчика. Встроенный Пролог Грамматики с определенными предложениями могут быть применены на этом этапе.
Python
Основной общий механизм сериализации - это соленый огурец стандартная библиотека модуль, ссылаясь на термин системы баз данных травление[27][28][29] для описания сериализации данных (рассыпание за десериализация). Pickle использует простой стек на основе виртуальная машина в котором записаны инструкции, использованные для восстановления объекта. Это кросс-версия настраиваемый но небезопасный (небезопасный от ошибочных или злонамеренных данных) формат сериализации. Неправильные или злонамеренно созданные данные могут привести к тому, что десериализатор импортирует произвольные модули и создаст экземпляр любого объекта.[30][31] Стандартная библиотека также включает модули сериализации в стандартные форматы данных: json (со встроенной поддержкой базовых скалярных типов и типов коллекций и возможностью поддержки произвольных типов через хуки кодирования и декодирования ). plistlib (с поддержкой как двоичного, так и XML список недвижимости форматы). xdrlib (с поддержкой стандарта внешнего представления данных (XDR), как описано в RFC 1014 ). Наконец, рекомендуется, чтобы объект __repr__ быть оцененным в правильной среде, что делает его грубым совпадением с Common Lisp объект печати. Не все типы объектов могут быть обработаны автоматически, особенно те, которые содержат Операционная система ресурсы, такие как файловые ручки, но пользователи могут зарегистрировать собственные функции «сокращения» и построения для поддержки травления и распаковки произвольных типов. Pickle изначально был реализован как чистый Python соленый огурец модуль, но в версиях Python до 3.0 cPickle модуль (также встроенный) предлагает улучшенную производительность (до 1000 раз быстрее[30]). В cPickle был адаптирован из Незагруженная ласточка проект. В Python 3 пользователи всегда должны импортировать стандартную версию, которая пытается импортировать ускоренную версию и возвращается к чистой версии Python.[32]
р
р имеет функцию dput который записывает текстовое представление ASCII объекта R в файл или соединение. Представление можно прочитать из файла с помощью dget.[33] Более конкретно, функция сериализовать сериализует объект R в соединение, на выходе - необработанный вектор, закодированный в шестнадцатеричном формате. В десериализовать функция позволяет читать объект из соединения или необработанного вектора.[34]
REBOL
REBOL будет сериализован в файл (сохранить все) или в нить! (плесень / все). Строки и файлы можно десериализовать с помощью полиморфный нагрузка функция. RProtoBuf обеспечивает сериализацию данных на разных языках в R, используя Буферы протокола.[35]
Рубин
Рубин включает стандартный модуль Маршал с 2 методами свалка и нагрузка, похожие на стандартные утилиты Unix свалка и восстановить. Эти методы сериализуются в стандартный класс Нить, то есть они фактически становятся последовательностью байтов. Некоторые объекты не могут быть сериализованы (это может вызвать TypeError исключение): привязки, объекты процедур, экземпляры класса IO, одиночные объекты и интерфейсы. Если класс требует настраиваемой сериализации (например, требует определенных действий по очистке, выполняемых при сбросе / восстановлении), это можно сделать, реализовав 2 метода: _свалка и _нагрузка. Метод экземпляра _свалка должен вернуть Нить объект, содержащий всю информацию, необходимую для воссоздания объектов этого класса и всех ссылочных объектов до максимальной глубины, заданной как целочисленный параметр (значение -1 означает, что проверка глубины должна быть отключена). Метод класса _нагрузка следует принять Нить и вернуть объект этого класса.
Болтовня
В общем, нерекурсивные и не разделяемые объекты могут быть сохранены и извлечены в удобочитаемой форме с помощью storeOn:/читать с: протокол. В storeOn: генерирует текст выражения Smalltalk, которое - при оценке с использованием читать с: - воссоздает исходный объект. Эта схема особенная, поскольку в ней используется процедурное описание объекта, а не сами данные. Поэтому он очень гибкий, позволяя классам определять более компактные представления. Однако в своей исходной форме он не обрабатывает циклические структуры данных и не сохраняет идентичность общих ссылок (т.е. две ссылки на один объект будут восстановлены как ссылки на две равные, но не идентичные копии). Для этого существуют различные портативные и непереносимые альтернативы. Некоторые из них относятся к конкретной реализации Smalltalk или библиотеке классов. Есть несколько способов в Писк Smalltalk для сериализации и хранения объектов. Самыми простыми и часто используемыми являются storeOn: / readFrom: и двоичные форматы хранения на основе SmartRefStream сериализаторы. Кроме того, связанные объекты можно сохранять и извлекать с помощью ImageSegments. Оба предоставляют так называемую «структуру хранения двоичных объектов», которая поддерживает сериализацию в компактную двоичную форму и извлечение из нее. Оба обрабатывают циклические, рекурсивные и общие структуры, хранение / извлечение информации о классах и метаклассах и включают механизмы для миграции объектов «на лету» (то есть для преобразования экземпляров, которые были написаны более старой версией класса с другим макетом объекта). API-интерфейсы похожи (storeBinary / readBinary), но детали кодирования различны, что делает эти два формата несовместимыми. Однако код Smalltalk / X имеет открытый исходный код, бесплатный и может быть загружен в другие Smalltalks для обеспечения междиалектного обмена объектами. Сериализация объектов не входит в спецификацию ANSI Smalltalk. В результате код для сериализации объекта зависит от реализации Smalltalk. Результирующие двоичные данные также меняются. Например, сериализованный объект, созданный в Squeak Smalltalk, не может быть восстановлен в Ambrai Smalltalk. Следовательно, различные приложения, которые действительно работают с несколькими реализациями Smalltalk, которые полагаются на сериализацию объектов, не могут совместно использовать данные между этими различными реализациями. Эти приложения включают базу данных объектов MinneStore [3] и немного RPC пакеты. Решение этой проблемы - SIXX [4], который представляет собой пакет для нескольких Smalltalks, использующий XML формат для сериализации.
Быстрый
В Быстрый стандартная библиотека предоставляет два протокола, Кодируемый и Декодируемый (составленные вместе как Кодируемый), которые позволяют сериализовать или десериализовать экземпляры соответствующих типов в JSON, списки недвижимости, или другие форматы.[36] Реализации этих протоколов по умолчанию могут быть сгенерированы компилятором для типов, сохраненные свойства которых также Декодируемый или же Кодируемый.
Windows PowerShell
Windows PowerShell реализует сериализацию через встроенный командлет Экспорт-CliXML. Экспорт-CliXML сериализует объекты .NET и сохраняет полученный XML в файле. Чтобы воссоздать объекты, используйте Импорт-CliXML командлет, который создает десериализованный объект из XML в экспортированном файле. Десериализованные объекты, часто известные как «пакеты свойств», не являются живыми объектами; это снимки, у которых есть свойства, но нет методов. Двумерные структуры данных также могут быть (де) сериализованы в CSV форматирование с помощью встроенных командлетов Импорт-CSV и Экспорт-CSV.

Смотрите также

Рекомендации

  1. ^ Клайн, Маршалл. "C ++ FAQ:" Что это за "сериализация"?"". Архивировано из оригинал на 2015-04-05. Он позволяет вам взять объект или группу объектов, поместить их на диск или отправить их по проводному или беспроводному транспортному механизму, а затем, возможно, на другом компьютере, отменить процесс, воскресив исходный объект (ы). Основные механизмы состоят в том, чтобы сгладить объект (ы) в одномерный поток битов и превратить этот поток битов обратно в исходный объект (ы).
  2. ^ С. Миллер, Марк. «Безопасная сериализация при взаимном подозрении». ERights.org. Сериализация, описанная ниже, является примером инструмента, используемого объектами в объектной системе для работы с графом, в который они встроены. Похоже, это требует нарушения инкапсуляции, обеспечиваемой чистой объектной моделью.
  3. ^ Sun Microsystems (1987). «XDR: Стандарт представления внешних данных». RFC 1014. Сетевая рабочая группа. Получено 11 июля, 2011.
  4. ^ «Сериализация». www.boost.org.
  5. ^ Бил, Стефан. "s11n.net: сериализация / сохранение объекта в C ++". s11n.net.
  6. ^ "зерновые Документы - Главная". uscilab.github.io.
  7. ^ https://golang.org/pkg/encoding/. Отсутствует или пусто | название = (помощь)
  8. ^ https://github.com/go-yaml/yaml. Отсутствует или пусто | название = (помощь)
  9. ^ "Документация Text.Show". Получено 15 января 2014.
  10. ^ "Спросите TOM" Сериализация объектов Java в базе данных (и ge ..."". asktom.oracle.com.
  11. ^ "JSON". Веб-документы MDN. Получено 22 марта 2018.
  12. ^ "JSON". www.json.org. Получено 22 марта 2018.
  13. ^ Холм, Магнус (15 мая 2011 г.). «JSON: подмножество JavaScript, которого нет». Вечное хранилище. Получено 23 сентября 2016.
  14. ^ "Предложение TC39: Подписка JSON". Комитет ECMA TC39. 22 мая 2018.
  15. ^ «Сериализация». docs.julialang.org. Получено 2018-07-24.
  16. ^ "более быстрая и компактная сериализация символов и строк · JuliaLang / julia @ bb67ff2". GitHub.
  17. ^ «HDF5.jl: Сохранение и загрузка данных в формате файла HDF5». 20 августа 2017 г. - через GitHub.
  18. ^ «Юля: насколько стабильны serialize () / deserialize ()». stackoverflow.com.
  19. ^ "Сериализаторы .NET". Есть много видов сериализаторов; они очень быстро производят очень компактные данные. Существуют сериализаторы для обмена сообщениями, для хранилищ данных, для маршалинга объектов. Какой лучший сериализатор в .NET?
  20. ^ "СЕРБЕНЧ от aumcode". aumcode.github.io.
  21. ^ «PHP: сериализация объектов - руководство». ca.php.net.
  22. ^ Эссер, Стивен (28 ноября 2009 г.). «Шокирующие новости об эксплуатации PHP». Suspekt ... Архивировано из оригинал на 2012-01-06.
  23. ^ «PHP: сериализуемый - Руководство». www.php.net.
  24. ^ ""Срок чтения и письма"". www.swi-prolog.org.
  25. ^ ""write_term / [2,3]"". sicstus.sics.se.
  26. ^ ""Срок ввода / вывода"". gprolog.org.
  27. ^ Херлихи, Морис; Лисков, Варвара (Октябрь 1982 г.). «Метод передачи значений для абстрактных типов данных» (PDF). Транзакции ACM по языкам и системам программирования. 4 (4): 527–551. CiteSeerX  10.1.1.87.5301. Дои:10.1145/69622.357182. ISSN  0164-0925. OCLC  67989840.
  28. ^ Биррелл, Эндрю; Джонс, Майк; Воббер, Тед (ноябрь 1987 г.). «Простая и эффективная реализация для небольших баз данных». Обзор операционных систем ACM SIGOPS: Материалы 11-го симпозиума ACM по принципам операционных систем. 11 (5): 149–154. CiteSeerX  10.1.1.100.1457. Дои:10.1145/41457.37517. ISSN  0163-5980. OCLC  476062921. Наша реализация использует механизм, называемый «pickles», который преобразует любую строго типизированную структуру данных в представление этой структуры, подходящее для хранения в постоянных файлах на диске. Операция Pickle.Write принимает указатель на строго типизированную структуру данных и предоставляет буферы битов для записи на диск. И наоборот, Pickle.Read считывает битовые буферы с диска и доставляет копию исходной структуры данных. (*) Это преобразование включает в себя идентификацию вхождений адресов в структуре и упорядочение их при считывании структуры с диска. заменены на адреса, действительные в текущей среде выполнения. Механизм pickle полностью автоматический: он управляется структурами ввода во время выполнения, которые присутствуют в нашем механизме сборки мусора. ... (*) Консервирование очень похоже на концепцию маршалинга в удаленных вызовах процедур. Но на самом деле наша реализация травления работает только путем интерпретации во время выполнения структуры динамически типизированных значений, в то время как наша реализация RPC работает только путем генерации кода для маршалинга статически типизированных значений. Каждое средство выиграет от добавления механизмов другого, но этого еще не сделано.
  29. ^ ван Россум, Гвидо (1 декабря 1994 г.). «Сглаживание объектов Python». Язык программирования Python - устаревший веб-сайт. Делавэр, Соединенные Штаты: Фонд программного обеспечения Python. Получено 6 апреля 2017. Происхождение названия «уплощение»: поскольку я хочу оставить исходный модуль «маршал» в покое, а Джим жаловался, что «сериализация» также означает нечто совершенно иное, что действительно актуально в контексте одновременного доступа к постоянным объектам, я буду использовать термин «сглаживание» отныне. ... (Система Modula-3 использует термин «маринованные» данные для этой концепции. Они, вероятно, уже решили все проблемы, причем безопасным для типов способом :-)
  30. ^ а б «11.1. Pickle - сериализация объектов Python - документация Python 2.7.14rc1». docs.python.org.
  31. ^ "pickle - сериализация объектов Python - документация Python v3.0.1". docs.python.org.
  32. ^ «Что нового в Python 3.0 - документация по Python v3.1.5». docs.python.org.
  33. ^ [R руководство http://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html ]
  34. ^ [R руководство http://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html ]
  35. ^ Эддельбюттель, Дирк; Стокли, Мюррей; Оомс, Джерун (2014). «RProtoBuf: эффективная межъязыковая сериализация данных в R». Журнал статистического программного обеспечения. 71 (2). arXiv:1401.7372. Дои:10.18637 / jss.v071.i02.
  36. ^ «Быстрое архивирование и сериализация». www.github.com. 2018-12-02.

внешняя ссылка