Что такое маршаллинг? Что происходит, когда что-то "выстраивается"?"

Я знаю, что этот вопрос был задан, по крайней мере здесь.

Это заставляет меня спросить, Что такое маршаллинг, на самом деле? Когда вы даете определение маршалинга, как бы вы его определили, чтобы он объяснял случае взаимодействия, а также в случаях, когда вы "Сортировочная" между потоками?

6 ответов


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

Как эти данные, если они произвольно сложны, должны быть отправлены в сообщении?

маршаллинг-это процесс преобразования поля данных или всего набора связанных структур в сериализованную строку, которую можно отправить в сообщении. Маршаллу двоичному число, можно преобразовать его в шестнадцатеричная разрядная строка, если формат сообщения должен быть текстовым. Если сообщение будет носить двоичные данные, двоичные числа могут быть преобразованы в 4 с прямым порядком байтов нормализованные двоичные байты и послал в ту сторону. Указатели сложнее; часто приходится преобразовывать их в абстрактную ссылку (например, "номер узла"), которая не зависит от фактических местоположений памяти.

конечно, если вы" Маршалл "данных, вы должны в конечном итоге "unmarshall", который является процессом чтения последовательного потока и реконструировать переданные данные (структуру).

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


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

например, в .NET, уровень взаимодействия при работе с собственными типами " маршалы "ваши данные из типа .NET в соответствующую форму для вызова собственного метода, а затем" маршалы " результаты обратно.

Что касается "маршалинга" между потоками-часто вам нужно будет иметь код для запуска в другом потоке, чем текущий. Например, если вы используете Windows Forms, вы не можете изменить элемент пользовательского интерфейса в потоке threadpool, поэтому вам нужно "маршалировать" вызов обратно в поток пользовательского интерфейса. Это делается путем создания делегата и передачи делегата обратно в поток пользовательского интерфейса через Control.Invoke (который использует довольно сложную систему для публикации этого в надлежащем контексте синхронизации), который, в свою очередь, запускает делегат в потоке пользовательского интерфейса для вас.


Википедии определение на самом деле очень хорошо.

общая концепция маршалинга такая же, как" сериализация": переход от представления в памяти (которое, в некотором смысле, не похоже на представление вообще-когда что - то находится в памяти, оно просто" существует") к представлению" печатной копии", будь то XML или, возможно, двоичный поток или что-то еще. Однако, в зависимости от того, что вы делаете, это также может означать какое-то преобразование или перевод на целевой формат.

для маршалинга процессов: один поток не просто " вызывает "другой - данные должны быть упакованы и" отправлены " из одного потока в другой. Маршаллинг-это процесс упаковки этих данных (например, данных о методе, который вы хотите вызвать, и его параметрах).

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


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

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

У меня есть некоторые данные, скажем, массив целых чисел или любой тип данных по моему выбору, и я хочу сделать его доступным для использования в моем коде C# после того, как мой код c++ выполнит некоторые операции над ним.

Я не могу просто сказать "Эй, вот где находится массив, делай, что хочешь" с кодом C#. Массив ints в C++ может храниться не так, как в C#. Маршалинг давайте передадим эти данные независимым от среды образом, чтобы любая сторона видела данные одинаково точно.

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

tl;dr: маршалинг предоставляет вам способ последовательного представления данных в различных операционных средах


С Википедия - Сортировочная (информатика):

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

в случае вызова неуправляемой функции из .NET маршалинг используется для преобразуйте данные .NET в данные, которые может использовать неуправляемая функция. Например, System.String основан на Unicode, но эта строка может потребоваться преобразовать в строку ANSI для передачи в неуправляемую функцию C.

для потоковой передачи маршалинг обычно относится к передаче права собственности на некоторые данные из одного потока в другой поток. Например, программа имеет два потока. Первый поток считывает данные из сети, а второй поток вычисляет эти данные. После сети поток считывает некоторые данные, которые он передает (т. е. "маршалы") данные в поток вычислений для обработки. Это может быть сделано путем записи данных в очередь, разделяемую между двумя потоками.

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


это обычно используется в контексте ", написанный в формате XML", но может быть упорядочен в любой формат.

2.  To arrange, place, or set in methodical order.
   (from American Heritage® Dictionary of the English Language)

Это означает, что вы упорядочиваете данные в методическом порядке/формате, который вы хотите. Часто это в формате XML.