stringtranslate.com

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

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

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

Использование

Примеры приложений сериализации включают в себя такие методы, как:

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

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

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

Поскольку и сериализация, и десериализация могут управляться общим кодом (например, функцией Serialize в Microsoft Foundation Classes ), общий код может выполнять оба действия одновременно и, таким образом: 1) обнаруживать различия между объектами, сериализованные и их предыдущие копии, и 2) предоставить входные данные для следующего такого обнаружения. Нет необходимости фактически создавать предыдущую копию, поскольку различия можно обнаружить «на лету» — метод, называемый дифференциальным выполнением. Это полезно при программировании пользовательских интерфейсов, содержимое которых меняется во времени: графические объекты можно создавать, удалять, изменять или создавать для обработки входных событий без необходимости писать для этого отдельный код.

Недостатки

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

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

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

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

Технология Xerox Network Systems Courier в начале 1980-х годов повлияла на первый широко принятый стандарт. Компания Sun Microsystems опубликовала документ «Внешнее представление данных» (XDR) в 1987 году. [6] XDR — это открытый формат , стандартизированный как STD 67 (RFC 4506).

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

JSON — это легкая текстовая альтернатива XML, которая также широко используется для связи клиент-сервер в веб-приложениях. JSON основан на синтаксисе JavaScript , но не зависит от JavaScript и поддерживается во многих других языках программирования. JSON — это открытый формат, стандартизированный как STD 90 ( RFC  8259), ECMA-404 и ISO/IEC 21778:2017.

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

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

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

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

Некоторые объектно-ориентированные языки программирования напрямую поддерживают сериализацию объектов (или архивирование объектов ), либо с помощью элементов синтаксического сахара , либо предоставляя для этого стандартный интерфейс . Языки, которые это делают, включают Ruby , Smalltalk , Python , PHP , Objective-C , Delphi , Java и семейство языков .NET . Также доступны библиотеки, которые добавляют поддержку сериализации в языки, в которых ее нет.

С и С++

C и C++ не предоставляют сериализацию как какую-либо конструкцию высокого уровня, но оба языка поддерживают запись любых встроенных типов данных , а также простых старых структур данных в виде двоичных данных. Таким образом, обычно написать собственные функции сериализации тривиально. Более того, решения на основе компилятора, такие как система ODB ORM для C++ и инструментарий gSOAP для C и C++, способны автоматически создавать код сериализации с небольшими изменениями или без изменений в объявлениях классов. Другими популярными фреймворками сериализации являются Boost.Serialization [7] из Boost Framework , фреймворк S11n, [8] и Cereal. [9] Платформа MFC (Microsoft) также предоставляет методологию сериализации как часть своей архитектуры Document-View.

CFML

CFML позволяет сериализовать структуры данных в WDDX с помощью <cfwddx>тега и в JSON с помощью функции SerializeJSON().

Дельфи

Delphi предоставляет встроенный механизм сериализации компонентов (также называемых постоянными объектами), который полностью интегрирован с его IDE . Содержимое компонента сохраняется в файл DFM и перезагружается на лету.

Идти

Go изначально поддерживает демаршалинг/маршалинг данных JSON и XML . [10] Существуют также сторонние модули, поддерживающие YAML [11] и протокольные буферы . [12] Go также поддерживает Gobs . [13]

Хаскелл

В Haskell сериализация поддерживается для типов, которые являются членами классов типов Read и Show . Каждый тип, являющийся членом класса Readтипов, определяет функцию, которая будет извлекать данные из строкового представления выгруженных данных. Класс Showтипов, в свою очередь, содержит showфункцию, из которой можно сгенерировать строковое представление объекта. Программисту не нужно явно определять функции — простое объявление типа, производного от Read или производного от Show, или того и другого, может заставить компилятор генерировать соответствующие функции во многих случаях (но не во всех: типы функций, например, не могут автоматически наследовать Show или Читать). Автоматически сгенерированный экземпляр Show также создает действительный исходный код, поэтому то же значение Haskell можно сгенерировать, запустив код, созданный show, например, в интерпретаторе Haskell. [14] Для более эффективной сериализации существуют библиотеки Haskell, которые позволяют выполнять высокоскоростную сериализацию в двоичном формате, например двоичном.

Джава

Java обеспечивает автоматическую сериализацию, которая требует, чтобы объект был помечен путем реализации java.io.Serializable интерфейса . Реализация интерфейса помечает класс как «пригодный для сериализации», а затем Java обрабатывает сериализацию внутри себя. В интерфейсе не определены методы сериализации Serializable, но сериализуемый класс может дополнительно определять методы с определенными специальными именами и сигнатурами, которые, если они определены, будут вызываться как часть процесса сериализации/десериализации. Язык также позволяет разработчику более тщательно переопределить процесс сериализации, реализовав другой интерфейс, интерфейс Externalizable, который включает в себя два специальных метода, которые используются для сохранения и восстановления состояния объекта.
Существует три основные причины, по которым объекты по умолчанию не подлежат сериализации и должны реализовывать Serializableинтерфейс для доступа к механизму сериализации Java.
Во-первых, не все объекты сохраняют полезную семантику в сериализованном состоянии. Например, Threadобъект привязан к состоянию текущей JVM . Не существует контекста, в котором десериализованный Threadобъект мог бы поддерживать полезную семантику.
Во-вторых, сериализованное состояние объекта является частью контракта совместимости его класса. Поддержание совместимости между версиями сериализуемых классов требует дополнительных усилий и внимания. Следовательно, создание сериализуемого класса должно быть осознанным проектным решением, а не условием по умолчанию.
Наконец, сериализация обеспечивает доступ к непереходным частным членам класса, которые иначе недоступны. Классы, содержащие конфиденциальную информацию (например, пароль), не должны быть ни сериализуемыми, ни внешними. [15] : 339–345  Стандартный метод кодирования использует рекурсивный графический перевод дескриптора класса объекта и сериализуемых полей в поток байтов. Примитивы , а также непереходные, нестатические объекты, на которые имеются ссылки, кодируются в поток. Каждый объект, на который сериализованный объект ссылается через поле, которое не помечено как, transientтакже должен быть сериализован; и если какой-либо объект в полном графе непереходных ссылок на объекты не является сериализуемым, то сериализация завершится неудачей. Разработчик может повлиять на это поведение, помечая объекты как временные или переопределив сериализацию объекта так, чтобы некоторая часть ссылочного графа была усечена и не сериализовалась.
Java не использует конструктор для сериализации объектов. Объекты Java можно сериализовать через JDBC и сохранить их в базе данных. [16] Во время качаниякомпоненты реализуют интерфейс Serializable, их переносимость между различными версиями виртуальной машины Java не гарантируется. Таким образом, компонент Swing или любой компонент, который его наследует, может быть сериализован в поток байтов, но не гарантируется, что его можно будет восстановить на другой машине.

JavaScript

Начиная с ECMAScript 5.1, [17] JavaScript включает встроенный JSONобъект и его методы, JSON.parse()а также JSON.stringify(). Хотя JSON изначально основан на подмножестве JavaScript, [18] существуют пограничные случаи, когда JSON не является допустимым JavaScript. В частности, JSON позволяет символам завершения строки Unicode U+2028 LINE SEPARATOR и U+2029 PARAGRAPH SEPARATOR отображаться в строках в кавычках без экранирования, в то время как ECMAScript 2018 и более ранние версии этого не делают. [19] [20] См. основную статью о JSON .

Юлия

Julia реализует сериализацию через модули serialize()/ [21] , предназначенные для работы в одной и той же версии Julia и/или экземпляре одного и того же системного образа. [22] Пакет предлагает более стабильную альтернативу, использующую документированный формат и общую библиотеку с оболочками для разных языков, [23] в то время как формат сериализации по умолчанию, как предполагается, был разработан с учетом максимальной производительности для сетевого взаимодействия. [24]deserialize()HDF5.jl

Лисп

Обычно структуру данных Lisp можно сериализовать с помощью функций " read" и " print". Переменная foo, содержащая, например, список массивов, будет напечатана с помощью (print foo). Аналогично объект может быть прочитан из потока с именем s с помощью (read s). Эти две части реализации Lisp называются принтером и устройством чтения. Вывод " print" удобен для чтения человеком; он использует списки, отмеченные круглыми скобками, например: . Во многих типах Lisp, включая Common Lisp , принтер не может представлять все типы данных, поскольку неясно, как это сделать. Например, в Common Lisp принтер не может печатать объекты CLOS. Вместо этого программист может написать метод для универсальной функции , который будет вызываться при печати объекта. Это чем-то похоже на метод, используемый в Ruby. Сам код Lisp написан в синтаксисе чтения, называемом синтаксисом чтения. Большинство языков используют отдельные и разные парсеры для работы с кодом и данными, Лисп использует только один. Файл, содержащий код Lisp, может быть прочитан в память как структура данных, преобразован другой программой, а затем, возможно, выполнен или записан, например, в цикле чтения-оценки-печати . Не все программы чтения/записи поддерживают циклические, рекурсивные или разделяемые структуры.(4 2.9 "x" y)print-object

.NET Framework

.NET Framework имеет несколько сериализаторов, разработанных Microsoft . Существует также множество сериализаторов сторонних производителей. Здесь обсуждаются и тестируются более десятка сериализаторов. [25] и здесь [26]

OCaml

Стандартная библиотека OCamlMarshal обеспечивает маршалинг через модуль [3] и функции Pervasives output_valueи input_value. Хотя программирование OCaml подвергается статической проверке типов, использование модуля Marshalможет нарушить гарантии типа, поскольку невозможно проверить, представляет ли немаршализованный поток объекты ожидаемого типа. В OCaml сложно маршалировать функцию или структуру данных, содержащую функцию (например, объект, содержащий метод), поскольку исполняемый код в функциях не может передаваться между разными программами. (Существует флаг для маршалинга позиции кода функции, но его можно демаршалировать только в той же программе). Стандартные функции маршалинга могут сохранять совместное использование и обрабатывать циклические данные, которые можно настроить с помощью флага.

Перл

Несколько модулей Perl , доступных на CPAN, предоставляют механизмы сериализации, включая Storable, JSON::XSи FreezeThaw. Storable включает функции для сериализации и десериализации структур данных Perl в файлы или скаляры Perl и обратно. Помимо сериализации непосредственно в файлы, Storableвключает freezeфункцию возврата сериализованной копии данных, упакованной в скаляр, и thawдесериализации такого скаляра. Это полезно для отправки сложной структуры данных через сетевой сокет или сохранения ее в базе данных. При сериализации структур с помощью Storable, существуют сетевые функции, которые всегда сохраняют свои данные в формате, читаемом на любом компьютере, с небольшой ценой скорости. Эти функции называются nstore, nfreezeи т. д. Не существует "n" функций для десериализации этих структур — обычные структуры thawи retrieveструктуры десериализации, сериализованные с помощью nфункций " " и их машинно-специфичных эквивалентов.

PHP

PHP изначально реализовал сериализацию посредством встроенных функций serialize()и unserialize(). [27] PHP может сериализовать любые типы данных, кроме ресурсов (указателей файлов, сокетов и т. д.). Встроенная unserialize()функция часто опасна при использовании с совершенно ненадежными данными. [28] Для объектов есть два « магических метода», которые могут быть реализованы внутри класса — __sleep()и __wakeup() — которые вызываются изнутри serialize()и unserialize()соответственно и которые могут очистить и восстановить объект. Например, может быть желательно закрыть соединение с базой данных при сериализации и восстановить соединение при десериализации; эта функциональность будет реализована этими двумя волшебными методами. Они также позволяют объекту выбирать, какие свойства сериализовать. Начиная с PHP 5.1, существует объектно-ориентированный механизм сериализации объектов — интерфейс Serializable. [29]

Пролог

Временная структура Пролога , которая является единственной структурой данных языка, может быть сериализована через встроенный предикат write_term/3и сериализована через встроенные предикаты read/1и read_term/2. Результирующий поток представляет собой несжатый текст (в некоторой кодировке, определяемой конфигурацией целевого потока), где любые свободные переменные в термине представлены именами переменных-заполнителей. Предикат write_term/3стандартизирован в спецификации ISO для Пролога (ISO/IEC 13211-1) на стр. 59 и далее. («Написание термина, § 7.10.5»). Поэтому ожидается, что термины, сериализованные в одной реализации, могут быть сериализованы в другой без двусмысленности или неожиданностей. На практике расширения, специфичные для конкретной реализации (например, словари SWI-Prolog), могут использовать нестандартные терминальные структуры, поэтому в крайних случаях совместимость может нарушаться. В качестве примеров см. соответствующие страницы руководства для SWI-Prolog, [30] SICStus Prolog, [31] GNU Prolog. [32] Вопрос о том, проверяются ли и как сериализованные термины, полученные по сети, на соответствие спецификации (после того, как произошла десериализация из потока символов), остается на усмотрение разработчика. На этом этапе можно применить встроенные в Пролог грамматики определенных предложений .

Питон

Основным общим механизмом сериализации является pickle стандартный библиотечный модуль, отсылающий к термину травления в системах баз данных [33] [34] [35] для описания сериализации данных ( распаковка для десериализации ). Pickle использует простую виртуальную машину на основе стека , которая записывает инструкции, используемые для реконструкции объекта. Это настраиваемый, но небезопасный (не защищенный от ошибочных или вредоносных данных) формат сериализации. Неверно сформированные или злонамеренно созданные данные могут привести к тому, что десериализатор импортирует произвольные модули и создаст экземпляр любого объекта. [36] [37] Стандартная библиотека также включает модули, сериализующие стандартные форматы данных: (со встроенной поддержкой базовых скалярных и коллекционных типов и возможностью поддержки произвольных типов посредством перехватчиков кодирования и декодирования). (с поддержкой как двоичного формата, так и формата списка свойств XML ). (с поддержкой стандарта внешнего представления данных (XDR), как описано в RFC 1014). Наконец, рекомендуется, чтобы объект можно было оценить в правильной среде, что делает его приблизительным соответствием Common Lisp . Не все типы объектов могут быть маринованы автоматически, особенно те, которые содержат ресурсы операционной системы , такие как дескрипторы файлов , но пользователи могут регистрировать собственные функции «сокращения» и построения для поддержки маринования и распаковки произвольных типов. Первоначально Pickle был реализован как чистый модуль Python, но в версиях Python до 3.0 этот модуль (также встроенный) обеспечивает повышенную производительность (до 1000 раз быстрее [36] ). Он был адаптирован из проекта Unladen Swallow . В Python 3 пользователи всегда должны импортировать стандартную версию, которая пытается импортировать ускоренную версию и возвращается к чистой версии Python. [38]jsonplistlibxdrlib__repr__print-objectpicklecPicklecPickle

р

В R есть функция dput, которая записывает текстовое представление объекта R в формате ASCII в файл или соединение. Представление можно прочитать из файла с помощью dget. [39] Более конкретно, функция serializeсериализует объект R в соединение, выходными данными является необработанный вектор, закодированный в шестнадцатеричном формате. Функция unserializeпозволяет прочитать объект из соединения или необработанного вектора. [40]

РЕБОЛ

REBOL будет сериализоваться в файл ( save/all) или в string!( mold/all). Строки и файлы можно десериализовать с помощью полиморфной load функции. RProtoBufобеспечивает межъязыковую сериализацию данных в R с использованием протокольных буферов . [41]

Рубин

Ruby включает стандартный модуль Marshalс двумя методами dumpи load, аналогичный стандартным утилитам Unix dumpи restore. Эти методы сериализуются в стандартный класс String, то есть фактически становятся последовательностью байтов. Некоторые объекты не могут быть сериализованы (при этом возникнет TypeErrorисключение): привязки, объекты процедур, экземпляры класса IO, одноэлементные объекты и интерфейсы. Если класс требует пользовательской сериализации (например, требует выполнения определенных действий по очистке при дампе/восстановлении), это можно сделать, реализовав 2 метода: _dumpи _load. Метод экземпляра _dump должен возвращать Stringобъект, содержащий всю информацию, необходимую для восстановления объектов этого класса и всех объектов, на которые ссылаются, до максимальной глубины, заданной как целочисленный параметр (значение -1 подразумевает, что проверка глубины должна быть отключена). Метод класса _load должен принимать Stringи возвращать объект этого класса.

Ржавчина

Serde— наиболее широко используемая библиотека или набор для сериализации в Rust .

Болтовня

В общем, нерекурсивные и несовместные объекты можно хранить и извлекать в удобочитаемой форме с использованием протокола storeOn:/ readFrom:. Метод storeOn:генерирует текст выражения Smalltalk, которое при вычислении с помощью readFrom:воссоздает исходный объект. Эта схема особенна тем, что использует процедурное описание объекта, а не сами данные. Поэтому он очень гибок и позволяет классам определять более компактные представления. Однако в своей исходной форме он не обрабатывает циклические структуры данных и не сохраняет идентичность общих ссылок (т.е. две ссылки на один объект будут восстановлены как ссылки на две равные, но не идентичные копии). Для этого существуют различные портативные и непереносные альтернативы. Некоторые из них специфичны для конкретной реализации Smalltalk или библиотеки классов. В Squeak Smalltalk существует несколько способов сериализации и хранения объектов. Самыми простыми и наиболее используемыми являются storeOn:/readFrom:двоичные форматы хранения, основанные на SmartRefStreamсериализаторах. Кроме того, связанные объекты можно сохранять и извлекать с помощью ImageSegments. Оба предоставляют так называемую «инфраструктуру хранения двоичных объектов», которая поддерживает сериализацию и извлечение из компактной двоичной формы. Оба поддерживают циклические, рекурсивные и общие структуры, хранение/извлечение информации о классе и метаклассе и включают механизмы для миграции объектов «на лету» (т.е. для преобразования экземпляров, которые были написаны более старой версией класса с другим макетом объекта). API-интерфейсы схожи (storeBinary/readBinary), но детали кодирования различны, что делает эти два формата несовместимыми. Однако код Smalltalk/X имеет открытый исходный код, бесплатен и может быть загружен в другие Smalltalks, чтобы обеспечить междиалектный обмен объектами. Сериализация объектов не является частью спецификации ANSI Smalltalk. В результате код сериализации объекта зависит от реализации Smalltalk. Полученные двоичные данные также различаются. Например, сериализованный объект, созданный в Squeak Smalltalk, не может быть восстановлен в Ambrai Smalltalk. Следовательно, различные приложения, работающие с несколькими реализациями Smalltalk, использующими сериализацию объектов, не могут совместно использовать данные между этими различными реализациями. Эти приложения включают объектную базу данных MinneStore [42] и некоторые пакеты RPC . Решением этой проблемы является SIXX, [43] — пакет для нескольких Smalltalks, использующий для сериализации формат на основе XML .

Быстрый

Стандартная библиотека Swift предоставляет два протокола Encodableи Decodable(составленные вместе как Codable), которые позволяют сериализовать или десериализовать экземпляры соответствующих типов в JSON , списки свойств или другие форматы. [44] Реализации этих протоколов по умолчанию могут быть созданы компилятором для типов, хранимые свойства которых также Decodableили Encodable.

Windows PowerShell

Windows PowerShell реализует сериализацию посредством встроенного командлета Export-CliXML. Export-CliXMLсериализует объекты .NET и сохраняет полученный XML в файл. Чтобы восстановить объекты, используйте Import-CliXMLкомандлет, который создает десериализованный объект из XML в экспортированном файле. Десериализованные объекты, часто называемые «мешками свойств», не являются живыми объектами; это снимки, у которых есть свойства, но нет методов. Двумерные структуры данных также можно (де)сериализовать в формате CSV с помощью встроенных командлетов Import-CSVи Export-CSV.

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

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

  1. ^ Клайн, Маршалл. «Часто задаваемые вопросы по C++: «Что такое сериализация?». Архивировано из оригинала 5 апреля 2015 г. Он позволяет вам взять объект или группу объектов, поместить их на диск или отправить по проводному или беспроводному транспортному средству, а затем позже, возможно, на другом компьютере, обратить процесс вспять, воскресив исходный объект(ы). Основные механизмы заключаются в том, чтобы сгладить объект(ы) в одномерный поток битов и превратить этот поток битов обратно в исходный объект(ы).
  2. ^ «Модуль: Маршал (Ruby 3.0.2)» . Ruby-doc.org . Проверено 25 июля 2021 г.
  3. ^ аб "Маршал". ОКамл . Проверено 25 июля 2021 г.
  4. ^ «Документация Python 3.9.6 — Сериализация объектов Python — Pickle» . Документация — Стандартная библиотека Python .
  5. ^ С. Миллер, Марк. «Безопасная сериализация под взаимным подозрением». ERights.org . Сериализация, описанная ниже, является примером инструмента, используемого объектами внутри объектной системы для работы с графом, в который они встроены. Похоже, что это требует нарушения инкапсуляции, обеспечиваемой чистой объектной моделью.
  6. ^ Sun Microsystems (1987). «XDR: Стандарт представления внешних данных». РФК 1014 . Сетевая рабочая группа . Проверено 11 июля 2011 г.
  7. ^ «Сериализация». www.boost.org .
  8. ^ Бил, Стефан. «s11n.net: сериализация/сохранение объектов в C++». s11n.net .
  9. ^ "Документация по зерновым - Главная" . uscilab.github.io .
  10. ^ «Кодировка пакета». pkg.go.dev . 12 июля 2021 г.
  11. ^ «GitHub — поддержка YAML для языка Go» . Гитхаб . Проверено 25 июля 2021 г.
  12. ^ "прото · pkg.go.dev". pkg.go.dev . Проверено 22 июня 2021 г.
  13. ^ "пакет gob - кодировка/gob - pkg.go.dev". pkg.go.dev . Проверено 4 марта 2022 г.
  14. ^ "Документация Text.Show" . Проверено 15 января 2014 г.
  15. ^ Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991.
  16. ^ «Спросите ТОМА «Сериализация объектов Java в базу данных (и…»» . Asktom.oracle.com .
  17. ^ "JSON". Веб-документы MDN . Проверено 22 марта 2018 г.
  18. ^ "JSON". www.json.org . Проверено 22 марта 2018 г.
  19. Холм, Магнус (15 мая 2011 г.). «JSON: подмножество JavaScript, которого нет». Вечный репозиторий . Проверено 23 сентября 2016 г.
  20. ^ «Предложение TC39: включить JSON» . Комитет ECMA TC39. 22 мая 2018 г.
  21. ^ «Сериализация». Язык Джулии . Проверено 25 июля 2021 г.
  22. ^ «более быстрая и компактная сериализация символов и строк · JuliaLang/julia@bb67ff2». Гитхаб .
  23. ^ «HDF5.jl: Сохранение и загрузка данных в формате файла HDF5» . 20 августа 2017 г. – через GitHub.
  24. ^ «Юлия: насколько стабильны сериализация()/десериализация()» . stackoverflow.com . 2014.
  25. ^ «Сериализаторы .NET». Существует множество типов сериализаторов; они очень быстро производят очень компактные данные. Существуют сериализаторы для обмена сообщениями, для хранилищ данных, для маршалинга объектов. Какой сериализатор в .NET лучший?
  26. ^ "СЕРБЕНЧ по aumcode" . aumcode.github.io .
  27. ^ «PHP: Сериализация объектов — Руководство» . ca.php.net .
  28. ^ Эссер, Стивен (28 ноября 2009 г.). «Шокирующие новости об эксплуатации PHP». Подозреваемый.. . Архивировано из оригинала 06 января 2012 г.
  29. ^ «PHP: сериализуемый — Руководство» . www.php.net .
  30. ^ ""Термин чтения и письма"". www.swi-prolog.org .
  31. ^ ""write_term/[2,3]"". sicstus.sics.se .
  32. ^ ""Термин ввода/вывода"". gprolog.org .
  33. ^ Херлихи, Морис ; Лисков, Барбара (октябрь 1982 г.). «Метод передачи значений для абстрактных типов данных» (PDF) . Транзакции ACM в языках и системах программирования . 4 (4): 527–551. CiteSeerX 10.1.1.87.5301 . дои : 10.1145/69622.357182. ISSN  0164-0925. OCLC  67989840. S2CID  8126961. 
  34. ^ Биррелл, Эндрю; Джонс, Майк; Воббер, Тед (ноябрь 1987 г.). «Простая и эффективная реализация небольшой базы данных». Материалы одиннадцатого симпозиума ACM по принципам операционных систем - SOSP '87 . Том. 11. С. 149–154. CiteSeerX 10.1.1.100.1457 . дои : 10.1145/41457.37517. ISBN  089791242X. ISSN  0163-5980. OCLC  476062921. S2CID  12908261. В нашей реализации используется механизм под названием «pickles», который преобразует любую строго типизированную структуру данных в представление этой структуры, подходящее для хранения в постоянных дисковых файлах. Операция Pickle.Write принимает указатель на строго типизированную структуру данных и доставляет битовые буферы для записи на диск. И наоборот, Pickle.Read считывает битовые буферы с диска и доставляет копию исходной структуры данных. (*) Это преобразование включает в себя идентификацию вхождений адресов в структуру и организацию того, что при обратном чтении структуры с диска адреса будут заменены адресами, действительными в текущей среде выполнения. Механизм Pickle полностью автоматический: он управляется структурами типизации во время выполнения, которые присутствуют в нашем механизме сборки мусора. ... (*) Пиклинг очень похож на концепцию маршалинга при удаленных вызовах процедур. Но на самом деле наша реализация травления работает только путем интерпретации во время выполнения структуры динамически типизированных значений, тогда как наша реализация RPC работает только путем генерации кода для маршалинга статически типизированных значений. Каждое учреждение выиграет от добавления механизмов другого, но этого еще не сделано.
  35. ^ ван Россум, Гвидо (1 декабря 1994 г.). «Сглаживание объектов Python». Язык программирования Python — устаревший веб-сайт . Делавэр , США: Фонд программного обеспечения Python . Проверено 6 апреля 2017 г. Происхождение названия «сглаживание»: поскольку я хочу оставить исходный модуль «маршал» в покое, а Джим жаловался, что «сериализация» также означает нечто совершенно другое, что действительно актуально в контексте одновременного доступа к постоянным объектам, я буду использовать с этого момента термин «сглаживание». ... (В системе Modula-3 для этой концепции используется термин «маринованные» данные. Вероятно, они уже решили все проблемы, причем типобезопасным образом :-)
  36. ^ ab «11.1. Pickle — сериализация объектов Python — документация Python 2.7.14rc1». docs.python.org .
  37. ^ «pickle — сериализация объектов Python — документация Python v3.0.1» . docs.python.org .
  38. ^ «Что нового в Python 3.0 — документация Python v3.1.5» . docs.python.org .
  39. ^ [Руководство по R http://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html]
  40. ^ [Руководство по R http://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html]
  41. ^ Эддельбюттель, Дирк; Стокли, Мюррей; Омс, Йерун (2014). «RProtoBuf: эффективная межъязыковая сериализация данных в R». Журнал статистического программного обеспечения . 71 (2). arXiv : 1401.7372 . doi : 10.18637/jss.v071.i02. S2CID  36239952.
  42. ^ "MinneStore версия 2" . СоурсФордж . Архивировано из оригинала 11 мая 2008 года.
  43. ^ «Что нового». SIXX — обмен экземплярами Smalltalk в XML . 23 января 2010 года . Проверено 25 июля 2021 г.
  44. ^ «Быстрое архивирование и сериализация». www.github.com . 2018-12-02.

Внешние ссылки