Site icon AppTractor

Что такое Маршалинг

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

Основное определение

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

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

Простыми словами

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

Отличие от сериализации

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

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

Маршалинг отличается от сериализации тем, что он особым образом применяется к удалённым объектам. Для удалённых объектов не создаётся копия самого объекта, а лишь указывается удалённый адрес, по которому должна производиться работа с ним.[1]

Области применения

Маршалинг используется в следующих сценариях:

Практические примеры

Маршалинг в C# и .NET

В .NET маршалинг — это подсистема, которая передаёт сообщения из управляемого окружения в неуправляемое и обратно. Это один из основных сервисов, предоставляемых CLR (Common Language Runtime).

Из-за того, что у многих типов в неуправляемом окружении нет таких же типов в управляемом окружении, необходимо создать подпрограммы преобразования, которые будут конвертировать управляемые типы в неуправляемые и наоборот. Например, типы HRESULTDWORDHANDLE существуют в C++ коде, но отсутствуют в .NET.

Маршалинг в Go

В языке Go маршалинг активно используется для преобразования объектов в JSON и обратно. Вы можете вставлять специальные теги в структуры, легко преобразовывая объект в данные JSON с помощью встроенной службы маршалинга.

Маршалинг в мобильной разработке

В Android и iOS маршалинг происходит при взаимодействии с нативными библиотеками через JNI (Java Native Interface) или при работе с системными API. Например, при передаче данных между Kotlin/Swift кодом и нативными C/C++ библиотеками требуется преобразование типов данных.

Типы маршалинга

Существует два основных вида маршалинга:

Демаршалинг

Демаршалинг — это обратный процесс, при котором стандартная заглушка (stub) в пространстве процесса сервера распаковывает отправленные параметры и передаёт их приложению объекта. Заглушка также упаковывает информацию ответа для отправки клиенту обратно.

Заключение

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

Exit mobile version