Сериализация
В вычислительной технике сериализация (или сериализация ) — это процесс перевода структуры данных или состояния объекта в формат, который можно хранить (например, файлы на вторичных устройствах хранения , буферы данных на первичных устройствах хранения) или передавать (например, потоки данных по компьютерным сетям). ) и реконструирован позже (возможно, в другой компьютерной среде). [ 1 ] Когда полученная последовательность битов пересчитывается в соответствии с форматом сериализации, ее можно использовать для создания семантически идентичного клона исходного объекта. Для многих сложных объектов, например тех, которые широко используют ссылки , этот процесс не является простым. Сериализация объектов не включает в себя ни один из связанных с ними методов , с которыми они были ранее связаны.
Этот процесс сериализации объекта в некоторых ситуациях также называется маршалингом объекта. [ 2 ] [ 3 ] [ 4 ] Противоположная операция по извлечению структуры данных из ряда байтов — это десериализация (также называемая десериализацией или демаршалингом ).
В оборудовании сетевого оборудования часть, отвечающая за сериализацию и десериализацию, обычно называется SerDes .
Использование
[ редактировать ]Использование сериализации включает в себя:
- сериализация данных для передачи по проводам и сетям ( обмен сообщениями ).
- хранение данных (в базах данных , на жестких дисках ).
- вызовы удаленных процедур , например, как в SOAP .
- распространение объектов, особенно в компонентной разработке программного обеспечения, таких как COM , CORBA и т. д.
- обнаружение изменений в изменяющихся во времени данных.
Чтобы некоторые из этих функций были полезными, необходимо поддерживать независимость архитектуры. Например, для максимального использования распределения компьютер, работающий на другой аппаратной архитектуре, должен иметь возможность надежно реконструировать сериализованный поток данных независимо от порядка байтов . Это означает, что более простая и быстрая процедура прямого копирования структуры данных в памяти не может работать надежно для всех архитектур. Сериализация структуры данных в независимом от архитектуры формате означает предотвращение проблем с порядком байтов , размещением памяти или просто разными способами представления структур данных на разных языках программирования .
Любая схема сериализации присуща тому, что, поскольку кодирование данных по определению является последовательным, для извлечения одной части сериализованной структуры данных требуется, чтобы весь объект был прочитан от начала до конца и восстановлен. Во многих приложениях эта линейность является преимуществом, поскольку она позволяет использовать простые, общие интерфейсы ввода-вывода для хранения и передачи состояния объекта. В приложениях, где высокая производительность является проблемой, может иметь смысл приложить больше усилий для решения более сложной и нелинейной организации хранения.
Даже на одной машине примитивные объекты -указатели слишком хрупкие, чтобы их можно было сохранить, поскольку объекты, на которые они указывают, могут быть перезагружены в другое место памяти. Чтобы справиться с этим, процесс сериализации включает этап, называемый 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 ] и крупы. [ 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, которые обеспечивают высокоскоростную сериализацию в двоичном формате, например, binary .
Ява
[ редактировать ]Java обеспечивает автоматическую сериализацию, которая требует, чтобы объект был помечен путем реализации java.io.Serializable
интерфейс . Реализация интерфейса помечает класс как «пригодный для сериализации», а затем Java обрабатывает сериализацию внутри себя. На сервере не определены методы сериализации. Serializable
интерфейс, но сериализуемый класс может дополнительно определять методы с определенными специальными именами и сигнатурами, которые, если они определены, будут вызываться как часть процесса сериализации/десериализации. Язык также позволяет разработчику более тщательно переопределять процесс сериализации, реализуя другой интерфейс — Externalizable
интерфейс, включающий два специальных метода, которые используются для сохранения и восстановления состояния объекта.
Существует три основные причины, по которым объекты по умолчанию не подлежат сериализации и должны реализовывать Serializable
интерфейс для доступа к механизму сериализации Java.
Во-первых, не все объекты сохраняют полезную семантику в сериализованном состоянии. Например, Thread
объект привязан к состоянию текущей JVM . Нет контекста, в котором десериализованный Thread
объект будет поддерживать полезную семантику.
Во-вторых, сериализованное состояние объекта является частью контракта совместимости его класса. Поддержание совместимости между версиями сериализуемых классов требует дополнительных усилий и внимания. Следовательно, создание сериализуемого класса должно быть осознанным проектным решением, а не условием по умолчанию.
Наконец, сериализация обеспечивает доступ к непереходным частным членам класса, которые иначе недоступны. Классы, содержащие конфиденциальную информацию (например, пароль), не должны быть ни сериализуемыми, ни внешними. [ 15 ] : 339–345 Стандартный метод кодирования использует рекурсивный графический перевод дескриптора класса объекта и сериализуемых полей в поток байтов. Примитивы , а также непереходные, нестатические объекты, на которые имеются ссылки, кодируются в поток. Каждый объект, на который ссылается сериализованный объект через поле, не помеченное как transient
также должен быть сериализован; и если какой-либо объект в полном графе непереходных ссылок на объекты не является сериализуемым, то сериализация завершится неудачно. Разработчик может повлиять на это поведение, помечая объекты как временные или переопределив сериализацию объекта так, чтобы некоторая часть ссылочного графа была усечена и не сериализовалась.
Java не использует конструктор для сериализации объектов. Объекты Java можно сериализовать через JDBC и сохранить их в базе данных. [ 16 ] Хотя компоненты Swing реализуют интерфейс Serializable, их переносимость между различными версиями виртуальной машины Java не гарантируется. Таким образом, компонент Swing или любой компонент, который его наследует, может быть сериализован в поток байтов, но не гарантируется, что его можно будет восстановить на другой машине.
JavaScript
[ редактировать ]Начиная с ECMAScript 5.1, [ 17 ] JavaScript включает встроенный JSON
объект и его методы JSON.parse()
и JSON.stringify()
. Хотя JSON изначально основан на подмножестве JavaScript, [ 18 ] существуют пограничные случаи, когда JSON не является допустимым JavaScript. В частности, JSON позволяет использовать терминаторы строк в Юникоде. U+2028 РАЗДЕЛИТЕЛЬ СТРОК и U+2029 Разделитель абзацев будет отображаться в строках в кавычках без экранирования, а в ECMAScript 2018 и более ранних версиях — нет. [ 19 ] [ 20 ] См. основную статью о JSON. [ сломанный якорь ] .
Юлия
[ редактировать ]Джулия реализует сериализацию через serialize()
/ deserialize()
модули, [ 21 ] предназначен для работы в одной и той же версии Julia и/или экземпляре одного и того же образа системы. [ 22 ] HDF5.jl
пакет предлагает более стабильную альтернативу, использующую документированный формат и общую библиотеку с оболочками для разных языков. [ 23 ] в то время как формат сериализации по умолчанию предполагается, что он был разработан с учетом максимальной производительности сетевой связи. [ 24 ]
Лисп
[ редактировать ]Обычно структуру данных Lisp можно сериализовать с помощью функций " read
" и " print
". Переменная foo, содержащая, например, список массивов, будет напечатана (print foo)
. Аналогично объект может быть прочитан из потока с именем s с помощью (read s)
. Эти две части реализации Lisp называются принтером и устройством чтения. Вывод " print
" читается человеком; в нем используются списки, отмеченные круглыми скобками, например: (4 2.9 "x" y)
. Во многих типах Lisp, включая Common Lisp , принтер не может представлять все типы данных, поскольку неясно, как это сделать. Например, в Common Lisp принтер не может печатать объекты CLOS. Вместо этого программист может написать метод для общей функции. print-object
, это будет вызвано при печати объекта. Это чем-то похоже на метод, используемый в Ruby. Сам код Lisp написан в синтаксисе чтения, называемом синтаксисом чтения. Большинство языков используют отдельные и разные парсеры для работы с кодом и данными, Лисп использует только один. Файл, содержащий код Lisp, может быть прочитан в память как структура данных, преобразован другой программой, а затем, возможно, выполнен или записан, например, в цикле чтения-оценки-печати . Не все программы чтения/записи поддерживают циклические, рекурсивные или разделяемые структуры.
.NET Framework
[ редактировать ].NET Framework имеет несколько сериализаторов, разработанных Microsoft . Существует также множество сериализаторов сторонних производителей. обсуждается и тестируется более десятка сериализаторов Здесь . [ 25 ] и здесь [ 26 ]
OCaml
[ редактировать ]Стандартная библиотека OCaml обеспечивает сортировку через Marshal
модуль [ 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 для Prolog (ISO/IEC 13211-1) на стр. 59 и далее. («Написание термина, § 7.10.5»). Поэтому ожидается, что термины, сериализованные в одной реализации, могут быть сериализованы в другой без двусмысленности или неожиданностей. На практике расширения, специфичные для реализации (например, словари SWI-Prolog), могут использовать нестандартные терминальные структуры, поэтому в крайних случаях совместимость может нарушаться. В качестве примеров см. соответствующие страницы руководства SWI-Prolog, [ 30 ] SICStus Пролог, [ 31 ] GNU Пролог. [ 32 ] Вопрос о том, проверяются ли и каким образом сериализованные термины, полученные по сети, на соответствие спецификации (после того, как произошла десериализация из потока символов), остается на усмотрение разработчика. встроенные в Пролог грамматики определенных предложений На этом этапе можно применить .
Питон
[ редактировать ]Основным общим механизмом сериализации является pickle
стандартный библиотечный модуль, отсылающий к термину травления в системах баз данных. [ 33 ] [ 34 ] [ 35 ] для описания сериализации данных ( распаковка для десериализации ). Pickle использует простую стека на основе виртуальную машину , которая записывает инструкции, используемые для реконструкции объекта. Это настраиваемый, но небезопасный (не защищенный от ошибочных или вредоносных данных) формат сериализации. Неверно сформированные или злонамеренно созданные данные могут привести к тому, что десериализатор импортирует произвольные модули и создаст экземпляр любого объекта. [ 36 ] [ 37 ] Стандартная библиотека также включает модули сериализации в стандартные форматы данных: json
(со встроенной поддержкой базовых скалярных типов и типов коллекций, а также возможностью поддержки произвольных типов посредством перехватчиков кодирования и декодирования ). plistlib
(с поддержкой как двоичного формата, так и формата списка свойств XML ). xdrlib
(с поддержкой стандарта внешнего представления данных (XDR), как описано в RFC 1014). Наконец, рекомендуется, чтобы объект __repr__
быть вычислимым в нужной среде, что делает его приблизительным аналогом Common Lisp. print-object
. Не все типы объектов могут быть маринованы автоматически, особенно те, которые содержат операционной системы ресурсы , такие как дескрипторы файлов , но пользователи могут зарегистрировать собственные функции «сокращения» и построения для поддержки маринования и распаковки произвольных типов. Изначально Pickle был реализован как чистый Python. pickle
модуль, но в версиях Python до 3.0 cPickle
модуль (также встроенный) обеспечивает улучшенную производительность (до 1000 раз быстрее) [ 36 ] ). cPickle
был адаптирован из проекта Unladen Swallow . В Python 3 пользователи всегда должны импортировать стандартную версию, которая пытается импортировать ускоренную версию и возвращается к чистой версии Python. [ 38 ]
Р
[ редактировать ]R имеет функцию dput
который записывает текстовое представление ASCII объекта R в файл или соединение. Представление можно прочитать из файла, используя dget
. [ 39 ] Более конкретно, функция serialize
сериализует объект R для соединения, выходные данные представляют собой необработанный вектор, закодированный в шестнадцатеричном формате. unserialize
функция позволяет читать объект из соединения или необработанного вектора. [ 40 ]
РЕБОЛ
[ редактировать ]REBOL выполнит сериализацию в файл ( save/all
) или к string!
( mold/all
). Строки и файлы можно десериализовать с помощью полиморфного метода. load
функция. RProtoBuf
обеспечивает межъязыковую сериализацию данных в R с использованием протокольных буферов . [ 41 ]
Руби
[ редактировать ]Ruby включает стандартный модуль Marshal
с 2 методами 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
.
См. также
[ редактировать ]- Коммутация (телеметрия)
- Сравнение форматов сериализации данных
- Формат контейнера
- Спящий режим (Java)
- XML-схема
- Основные правила кодирования
- Буферы протоколов Google
- Викибаза
- Апач Авро
Ссылки
[ редактировать ]- ^ Клайн, Маршалл. «Часто задаваемые вопросы по C++: «Что такое сериализация?» » . Архивировано из оригинала 5 апреля 2015 г.
Он позволяет вам взять объект или группу объектов, поместить их на диск или отправить через проводной или беспроводной транспортный механизм, а затем позже, возможно, на другом компьютере, обратить процесс вспять, воскресив исходный объект(ы). Основные механизмы заключаются в том, чтобы сгладить объект(ы) в одномерный поток битов и превратить этот поток битов обратно в исходный объект(ы).
- ^ «Модуль: Маршал (Рубин 3.0.2)» . Ruby-doc.org . Проверено 25 июля 2021 г.
- ^ Jump up to: а б «Маршал» . ОКамл . Проверено 25 июля 2021 г.
- ^ «Документация Python 3.9.6 — сериализация объектов Python — Pickle» . Документация — Стандартная библиотека Python .
- ^ С. Миллер, Марк. «Безопасная сериализация под взаимным подозрением» . ERights.org .
Сериализация, описанная ниже, является примером инструмента, используемого объектами внутри объектной системы для работы с графом, в который они встроены. Похоже, что это требует нарушения инкапсуляции, обеспечиваемой чистой объектной моделью.
- ^ Сан Микросистемс (1987). «XDR: Стандарт представления внешних данных» . РФК 1014 . Сетевая рабочая группа . Проверено 11 июля 2011 г.
- ^ «Сериализация» . www.boost.org .
- ^ Бил, Стефан. «s11n.net: сериализация/сохранение объектов в C++» . s11n.net .
- ^ «Зерновые документы — Главная» . uscilab.github.io .
- ^ «Кодировка пакета» . pkg.go.dev . 12 июля 2021 г.
- ^ «GitHub — поддержка YAML для языка Go» . Гитхаб . Проверено 25 июля 2021 г.
- ^ «прото · pkg.go.dev» . pkg.go.dev . Проверено 22 июня 2021 г.
- ^ «пакет gob — кодировка/gob — pkg.go.dev» . pkg.go.dev . Проверено 4 марта 2022 г.
- ^ «Текст.Показать документацию» . Проверено 15 января 2014 г.
- ^ Блох, Джошуа (2018). «Эффективная Java: Руководство по языку программирования» (третье изд.). Аддисон-Уэсли. ISBN 978-0134685991 .
- ^ «Спросите TOM «Сериализация объектов Java в базу данных (и ge...» « . Asktom.oracle.com .
- ^ "JSON" . Веб-документы MDN . Проверено 22 марта 2018 г.
- ^ "JSON" . www.json.org . Проверено 22 марта 2018 г.
- ^ Холм, Магнус (15 мая 2011 г.). «JSON: подмножество JavaScript, которого нет» . Вечный репозиторий. Архивировано из оригинала 13 мая 2012 года . Проверено 23 сентября 2016 г.
- ^ «Предложение TC39: включить JSON» . Комитет ECMA TC39. 22 мая 2018 г.
- ^ «Сериализация» . Язык Джулии . Проверено 25 июля 2021 г.
- ^ «более быстрая и компактная сериализация символов и строк · JuliaLang/julia@bb67ff2» . Гитхаб .
- ^ «HDF5.jl: Сохранение и загрузка данных в формате файла HDF5» . 20 августа 2017 г. – через GitHub.
- ^ "Юля: насколько стабильны сериализация()/десериализация()" . stackoverflow.com . 2014.
- ^ «Сериализаторы .NET» .
Существует множество типов сериализаторов; они очень быстро производят очень компактные данные. Существуют сериализаторы для обмена сообщениями, для хранилищ данных, для маршалинга объектов. Какой сериализатор в .NET лучший?
- ^ «СЕРБЕНЧ по аумкоду» . aumcode.github.io .
- ^ «PHP: Сериализация объектов — Руководство» . ca.php.net .
- ^ Эссер, Стивен (28 ноября 2009 г.). «Шокирующие новости об эксплуатации PHP» . Подозреваемый.. . Архивировано из оригинала 06 января 2012 г.
- ^ «PHP: сериализуемый — Руководство» . www.php.net .
- ^ " "Термин чтения и письма" " . www.swi-prolog.org .
- ^ " "write_term/[2,3]" " . sicstus.sics.se .
- ^ " "Термин ввода/вывода" " . gprolog.org .
- ^ Херлихи, Морис ; Лисков, Барбара (октябрь 1982 г.). «Метод передачи значений для абстрактных типов данных» (PDF) . Транзакции ACM в языках и системах программирования . 4 (4): 527–551. CiteSeerX 10.1.1.87.5301 . дои : 10.1145/69622.357182 . ISSN 0164-0925 . OCLC 67989840 . S2CID 8126961 .
- ^ Биррелл, Эндрю; Джонс, Майк; Воббер, Тед (ноябрь 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 работает только путем генерации кода для маршалинга статически типизированных значений. Каждое учреждение выиграет от добавления механизмов другого, но этого еще не сделано.
- ^ ван Россум, Гвидо (1 декабря 1994 г.). «Сглаживание объектов Python» . Язык программирования Python — устаревший веб-сайт . Делавэр , США: Фонд программного обеспечения Python . Проверено 6 апреля 2017 г.
Происхождение названия «сглаживание»: поскольку я хочу оставить исходный модуль «маршал» в покое, а Джим жаловался, что «сериализация» также означает нечто совершенно другое, что действительно актуально в контексте одновременного доступа к постоянным объектам, я буду использовать с этого момента термин «сглаживание». ... (В системе Modula-3 для этой концепции используется термин «маринованные» данные. Вероятно, они уже решили все проблемы, причем типобезопасным образом :-)
- ^ Jump up to: а б «11.1. Pickle — сериализация объектов Python — документация Python 2.7.14rc1» . docs.python.org .
- ^ «pickle — сериализация объектов Python — документация Python v3.0.1» . docs.python.org .
- ^ «Что нового в Python 3.0 — документация по Python v3.1.5» . docs.python.org .
- ^ [Руководство по R http://stat.ethz.ch/R-manual/R-patched/library/base/html/dput.html ]
- ^ [Руководство по R http://stat.ethz.ch/R-manual/R-patched/library/base/html/serialize.html ]
- ^ Эддельбюттель, Дирк; Стокли, Мюррей; Омс, Йерун (2014). «RProtoBuf: эффективная межъязыковая сериализация данных в R». Журнал статистического программного обеспечения . 71 (2). arXiv : 1401.7372 . дои : 10.18637/jss.v071.i02 . S2CID 36239952 .
- ^ «MinneStore версия 2» . СоурсФордж . Архивировано из оригинала 11 мая 2008 года.
- ^ "Что нового" . SIXX — обмен экземплярами Smalltalk в XML . 23 января 2010 года . Проверено 25 июля 2021 г.
- ^ «Быстрое архивирование и сериализация» . www.github.com . 2018-12-02.
Внешние ссылки
[ редактировать ]- Документация по сериализации объектов Java
- Документация по сериализации объектов Java 1.4 .
- Durable Java: сериализация. Архивировано 25 ноября 2005 г. на Wayback Machine.
- Ресурсы по привязке XML-данных
- Databoard — двоичная сериализация с частичным и произвольным доступом, системой типов, RPC, адаптацией типов и текстовым форматом.