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


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

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

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

6 64

6 ответов:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Я не могу просто сказать "Эй, вот где находится массив, делайте то, что вы хотите" для кода C#. Массив int в 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.