Поделиться через


Атрибут wire_marshal

Атрибут [ wire_marshal] — это атрибут типа IDL, аналогичный синтаксису [ transmit_as], но обеспечивает более эффективный способ маршалирования данных в сети.

Атрибут [wire_marshal] используется для указания типа данных, который будет передаваться вместо типа данных, зависящее от приложения. Каждый тип приложения имеет соответствующий передаваемый тип, определяющий представление провода (представление, используемое в сети). Тип конкретного приложения не должен передаваться, но он должен быть типом, распознавающим MIDL. Чтобы маршалировать тип, неизвестный MIDL, используйте атрибут ACF [ user_marshal].

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

Необходимо предоставить подпрограммы для изменения размера, маршалинга и отмены сортировки данных, а также освобождения связанной памяти. В следующей таблице описаны четыре имена подпрограмм, предоставленных пользователем. Тип <> — это тип пользователя, указанный в определении типа [wire_marshal].

Рутина Описание
<типа>_UserSize Размер буфера данных RPC перед маршалингом на стороне клиента или сервера.
>_UserMarshal типа< Маршалирует данные на стороне клиента или сервера.
<типа>_UserUnmarshal Отменяет анализ данных на стороне клиента или сервера.
>_UserFree типа< Освобождает данные на стороне сервера.

 

Эти подпрограммы, предоставляемые программистом, предоставляются клиентом или серверным приложением на основе атрибутов направления.

Если параметр равен [только в], клиент передается серверу. Клиенту требуются функции>_UserSize типа<типа>_UserMarshal. Серверу требуется>_UserUnmarshal типа<>_UserFree функций.

Для параметра [out]-only сервер передает клиенту. Серверу требуются функции <типа>_UserSize и <типа>_UserMarshal, в то время как клиенту требуется функция <типа>_UserMarshal.

Атрибут user_marshal

правила маршалирования для user_marshal и wire_marshal

wire_marshal

user_marshal

NdrGetUserMarshalInfo