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


Представление данных

Вычислительные среды могут значительно отличаться, как и сетевые архитектуры. Чтобы удовлетворить эти различия, MIDL позволяет изменять способ представления данных. Иногда можно упростить разработку, преобразовав данные в формат, который проще обрабатывать приложением. Вы можете изменить формат данных приложения, чтобы его можно было более эффективно передавать по сети.

Атрибуты [transmit_as] и [represent_as] указывают компилятору связать передающийся тип, который заглушка передает между клиентом и сервером, с типом пользователя, используемым клиентом и серверным приложениями. Необходимо указать подпрограммы, которые выполняют преобразование между типом пользователя и передаваемым типом, а также подпрограммы для освобождения памяти, которая использовалась для хранения преобразованных данных. Использование атрибута [transmit_as] IDL или атрибута ACF [represent_as] указывает заглушку вызывать эти подпрограммы преобразования до и после передачи. Атрибут [transmit_as] позволяет преобразовать один тип данных в другой для передачи по сети. Атрибут [represent_as] позволяет управлять способом представления данных из сети в приложение.

Атрибуты [wire_marshal] и [user_marshal] являются расширениями Майкрософт для OSF-DCE IDL. Их синтаксис и функциональность аналогичны синтаксису атрибутов [transmit_as] и [represent_as] соответственно. Разница заключается в том, что вместо преобразования данных из одного типа в другой необходимо маршалировать данные напрямую. Для этого необходимо предоставить внешние подпрограммы для определения размера буфера данных на стороне клиента и сервера, маршалирования и демарширования данных на стороне клиента и сервера, а также освобождения данных на стороне сервера. Компилятор MIDL создает коды формата, которые предписывают обработчику NDR вызывать эти внешние подпрограммы при необходимости.

Атрибуты [wire_marshal] и [user_marshal] позволяют маршалировать типы данных, которые в противном случае не могли быть переданы через границы процесса. Кроме того, поскольку с преобразованием типа связано меньше затрат, [wire_marshal] и [user_marshal] обеспечивают повышенную производительность во время выполнения по сравнению с [transmit_as] и [represent_as]. Атрибуты [wire_marshal] и [user_marshal] являются взаимоисключающими по отношению друг к другу и по отношению к атрибутам [transmit_as] и [represent_as] для данного типа.

Важно отметить, что реализация атрибутов [wire_marshal] и [user_marshal] должна соответствовать правилам маршалинга, продиктовано спецификацией OSF-DCE. По этой причине использовать эти атрибуты не рекомендуется, если вы не знакомы с протоколом подключения. Дополнительные сведения о передаче синтаксиса NDR см. в www.opengroup.org.

В этом разделе представлен краткий обзор атрибутов MIDL в следующих разделах: