Маршалинг что это
Перейти к содержимому

Маршалинг что это

Маршалинг

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

Противоположный процесс называется демаршалингом (схож с десериализацией).

Содержание

Маршалинг применяется при передаче данных между процессами и/или потоками, например:

  • при использовании различных механизмов RPC;
  • при использовании P/Invoke на платформе .NET Framework (при переходе от неуправляемого типа в тип CLR);
  • в скриптах и приложениях, применяющих технологию XPCOM, поставляемую в составе Mozilla application framework (MFA). Браузер Mozilla Firefox — одно из самых известных приложений, созданных с применением MFA. Применение MFA позволило скриптовым языкам использовать технологию XPCOM через Cross-Platform Connect (XPConnect).

В стандартной библиотеке языка Python термин «маршалинг» схож по значению с термином «сериализация» [1] , но термины не являются синонимами в документе RFC 2713 («Schema for Representing Java(tm) Objects in an LDAP Directory»; октябрь 1999 года), на который опирается стандарт языка Java:

«Маршализовать» объект означает записать его состояние и овую(ые) базу(ы) [2] (URI, указывающий на расположение а класса объекта для загрузки) таким образом, чтобы при обратной операции получалась копия оригинала, предположительно с помощью автоматической загрузки определения класса объекта. Вы можете маршализовать любой объект, который является сериализуемым или удалённым (…). Маршалинг подобен сериализации, за исключением того, что при маршалинге указывается расположение исполняемого а. Маршалинг отличается от сериализации тем, что он особым образом применяется к удалённым объектам, для которых не создается копия самого объекта, а лишь указывается удалённый адрес, по которому должна производиться работа с ним.

«Сериализировать» объект означает превращать его состояние в поток байтов таким образом, чтобы указанный поток мог быть преобразован обратно в копию исходного объекта.

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

Маршалинг — что это такое и зачем он нужен?

Мне трудно поверить, что я не могу послать int по проводу из C# в C и должен его маршаллировать. Почему C# не может просто послать 32 бита с начальным и конечным сигналом, сообщая коду C, что он получил int ?

Если есть хорошие учебники или сайты о том, зачем нужен маршалинг и как его использовать, это было бы здорово.

 ZenLulz

Потому что разные языки и среды имеют разные соглашения о вызовах, разные соглашения о компоновке, разные размеры примитивов (ср. char в C# и char в C), разные соглашения о создании/уничтожении объектов и разные рекомендации по проектированию. Вам нужен способ вывести материал из управляемой земли туда, где неуправляемая земля сможет его увидеть и понять, и наоборот. Для этого и существует маршалинг.

.Чистый код(с#, VB) назвали «управляемый» и потому что это'ы с «управляемый» и с помощью среды CLR ([среда CLR][1])

Если вы пишете код на C или C++ или ассемблер это все называется «неуправляемый» и, поскольку среда CLR участвует. Вы несете ответственность за все выделение памяти/де-распределения.

Маршалинга процесс между управляемым и неуправляемым кодом; это одна из самых важных услуг, предоставляемых КЗР.

В чем разница между сериализацией и маршалингом?

Я знаю, что с точки зрения нескольких распределенных методов (таких как RPC) используется термин «маршалинг», но не понимаю, чем он отличается от сериализации. Разве они оба не превращают объекты в серии битов?

Связанный:

13 ответы

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

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

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

Как упоминает @Bill, могут быть дополнительные метаданные, такие как расположение базы кода или даже код реализации объекта.

Есть ли слово, которое означает одновременную сериализацию и десериализацию? Требуется имя для интерфейса с этими методами. — рафийский

@raffian, вы имеете в виду интерфейс, реализованный объектом, который подвергается сериализации и десериализации, или объектом, ответственным за управление процессом? Ключевые слова, которые я бы предложил, — это «Serializable» и «Formatter» соответственно; украсить ведущими I , изменение заглавных букв и т. д. по мере необходимости. — Джеффри Хантин

@JeffreyHantin Я имел в виду объект, отвечающий за управление процессом; Сейчас я использую ISerializer, но это только половина правды 🙂 — рафийский

@raffian в телекоммуникациях мы называем компонент, который сериализует и десериализует «SerDes» или «serdes», обычно произносится как sir-dez или sir-deez в зависимости от предпочтений. Я предполагаю, что он похож на «модем» (то есть «Модулятор-Демодулятор») по своей конструкции. — Давида

@naki это общеотраслевой подход — если вы посмотрите на таблицы данных высокоскоростных FPGA, в них будет упоминаться функциональность SERDES, хотя все они довольно современные, восходящие к 1990-м годам. Google Nграмм предполагает, что он стал более популярным в 1980-х годах, хотя я нашел экземпляр в таблице данных IBM из 1970 — Давида

У обоих есть одно общее — это сериализация объект. Сериализация используется для передачи объектов или их хранения. Но:

  • Сериализация: Когда вы сериализуете объект, в поток байтов записываются только данные члена этого объекта; не код, который фактически реализует объект.
  • Маршаллинг: Термин «Маршаллинг» используется, когда мы говорим о передача объекта удаленным объектам (RMI). В Marshalling Object сериализуется (сериализуются данные членов) + Кодовая база прилагается.

Итак, сериализация — это часть маршалинга.

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

Создан 14 июля ’18, 00:07

+1 за определение того, что CodeBase означает в этом контексте — Омар Салем

Маршалинг без сериализации действительно случается. См. Свинг invokeAndWait и форм Invoke , который маршалирует синхронный вызов потока пользовательского интерфейса без сериализации. — Джеффри Хантин

«не код, который фактически реализует объект»: означает ли это методы класса? или что это значит. Не могли бы вы объяснить. — Вишал Ананд

Что вы имеете в виду the implementation of this object ? Не могли бы вы привести конкретный пример Serialization и Marshalling ? — Симин Джи

сортировочный без сериализации происходит в некоторых контекстах, например, когда вызов функции передает поток управления между моделями потоков (например, между общим пулом потоков и библиотекой с одним закреплением) в рамках одного процесса. Вот почему я говорю, что они слабо синонимы в контексте RPC. — Джеффри Хантин

Термин «маршал» считается синонимом «сериализации» в стандартной библиотеке Python.1, но термины не являются синонимами в RFC 2713, относящемся к Java:

«Маршалировать» объект означает записывать его состояние и кодовую базу (и) таким образом, чтобы, когда упорядоченный объект «неупорядочен», была получена копия исходного объекта, возможно, путем автоматической загрузки определений класса объекта. Вы можете маршалировать любой сериализуемый или удаленный объект. Маршаллинг похож на сериализацию, за исключением того, что маршаллинг также записывает кодовые базы. Маршаллинг отличается от сериализации тем, что он специально обрабатывает удаленные объекты. (RFC 2713)

«Сериализовать» объект означает преобразовать его состояние в поток байтов таким образом, чтобы поток байтов можно было преобразовать обратно в копию объекта.

Таким образом, маршаллинг также сохраняет кодовая объекта в потоке байтов в дополнение к его состоянию.

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

«Кодовая база» на самом деле не означает «Код». Из «Как работает кодовая база» (goo.gl/VOM2YmКодовая база — это очень просто, как программы, использующие семантику удаленной загрузки классов RMI, находят новые классы. Когда отправитель объекта сериализует этот объект для передачи в другую JVM, он аннотирует сериализованный поток байтов информацией, называемой базой кода. Эта информация сообщает получателю, где можно найти реализацию этого объекта. Фактическая информация, хранящаяся в аннотации кодовой базы, представляет собой список URL-адресов, из которых можно загрузить файл класса для необходимого объекта. — Джузеппе Бертоне

@Neurone Это определение специфично для Jini и RMI. «Кодовая база» — это общий термин. en.wikipedia.org/wiki/Кодовая база — Билл Ящерица

@BilltheLizard Да, но поскольку вы говорите о маршалинге в Java, неправильно говорить, что разница между сериализацией и маршалингом заключается в том, что «маршаллинг сохраняет код объекта в дополнение к его состоянию», и это приводит к вопросу bjan. Маршаллинг сохраняет «кодовую базу» в дополнение к состоянию объекта. — Джузеппе Бертоне

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

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

При этом, как правило, это синонимы.

ответ дан 21 апр.

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

Маршалинг означает преобразование сигнатуры и параметров функции в однобайтовый массив. Специально для целей RPC.

Сериализация чаще всего относится к преобразованию всего объекта / дерева объектов в байтовый массив. Маршалинг будет сериализовать параметры объекта, чтобы добавить их в сообщение и передать по сети. * Сериализацию также можно использовать для хранения на диске. *

ответ дан 08 окт ’11, 16:10

сортировочный это правило, указывающее компилятору, как данные будут представлены в другой среде / системе; Например;

как вы можете видеть два разных строковых значения, представленные как разные типы значений.

Сериализация будет преобразовывать только содержимое объекта, а не представление (останется прежним) и будет подчиняться правилам сериализации (что экспортировать или нет). Например, частные значения не будут сериализованы, общедоступные значения да и структура объекта останутся прежними.

ответ дан 12 мар ’15, в 17:03

Вот более конкретные примеры того и другого:

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

При маршалинге данные не обязательно должны быть сглажены, но их необходимо преобразовать в другое альтернативное представление. весь кастинг — это маршалинг, но не весь маршалинг.

Маршалинг не требует использования динамического распределения, он также может быть просто преобразованием между структурами. Например, у вас может быть пара, но функция ожидает, что первый и второй элементы пары будут другими; преобразование / memcpy одной пары в другую не сработает, потому что fst и snd будут перевернуты.

Концепция маршалинга становится особенно важной, когда вы начинаете иметь дело с помеченными союзами многих типов. Например, вам может быть трудно заставить движок JavaScript печатать за вас «c-строку», но вы можете попросить его напечатать для вас обернутую c-строку. Или, если вы хотите напечатать строку из среды выполнения JavaScript в среде выполнения Lua или Python. Все они струнны, но часто без маршалинга не обойтись.

Меня недавно раздражало то, что массивы JScript маршалируются на C # как «__ComObject» и не имеют документированного способа игры с этим объектом. Я могу найти адрес, где он находится, но на самом деле я ничего об этом не знаю, поэтому единственный способ понять это — это ткнуть в него любым возможным способом и, надеюсь, найти полезную информацию о нем. Таким образом, становится проще создать новый объект с более удобным интерфейсом, таким как Scripting.Dictionary, скопировать в него данные из объекта массива JScript и передать этот объект в C # вместо массива JScript по умолчанию.

выше печатает «__ComObject», что является чем-то вроде черного ящика с точки зрения C #.

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

Основы в первую очередь

Байтовый поток — Поток — это последовательность данных. Входной поток — считывает данные из источника. Выходной поток — записывает данные в адресную книгу. Потоки байтов Java используются для побайтного ввода / вывода (8 бит за раз). Поток байтов подходит для обработки необработанных данных, таких как двоичные файлы. Потоки символов Java используются для ввода / вывода 2 байтов за раз, поскольку символы хранятся с использованием соглашений Unicode в Java с 2 байтами для каждого символа. Поток символов полезен, когда мы обрабатываем (читаем / записываем) текстовые файлы.

RMI (вызов удаленного метода) — API, который предоставляет механизм для создания распределенного приложения на java. RMI позволяет объекту вызывать методы для объекта, запущенного в другой JVM.

Оба Сериализация и сортировочный свободно используются как синонимы. Вот несколько отличий.

Сериализация — Члены данных объекта записываются в двоичную форму или поток байтов (а затем могут быть записаны в файл / память / базу данных и т. Д.). Никакая информация о типах данных не может быть сохранена после того, как члены данных объекта записаны в двоичную форму.

Введите описание изображения здесь

сортировочный — Объект сериализуется (в поток байтов в двоичном формате) с прикрепленным типом данных + кодовая база, а затем передается Удаленный объект (RMI). Маршаллинг преобразует тип данных в заранее определенное соглашение об именах, чтобы его можно было восстановить по исходному типу данных. Введите описание изображения здесь

Итак, сериализация — это часть маршалинга.

CodeBase это информация, которая сообщает получателю Object, где можно найти реализацию этого объекта. Любая программа, которая думает, что может когда-либо передать объект другой программе, которая, возможно, не видела его раньше, должна установить кодовую базу, чтобы получатель мог знать, откуда загрузить код, если у него нет кода, доступного локально. Получатель после десериализации объекта извлечет из него кодовую базу и загрузит код из этого места. (Скопировано из ответа @Nasir)

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *