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


Сериализация типов

Компилятор MIDL создает до трех функций для каждого типа, к которому применяется атрибут [ encode] или [ decode]. Например, для определяемого пользователем типа с именем MyType компилятор создает код для функций MyType_Encode, MyType_Decode и MyType_AlignSize. Для этих функций компилятор записывает прототипы в Stub.h, а исходный код — в Stub_c.c. Как правило, объект MyType можно закодировать с помощью MyType_Encode и декодировать объект из буфера с помощью MyType_Decode. MyType_AlignSize используется, если необходимо знать размер буфера маршалинга перед его выделением.

Компилятор MIDL создает следующую функцию кодирования. Эта функция сериализует данные для объекта, на который указывает pObject, и буфер получается в соответствии с методом, указанным в дескрипторе. После записи сериализованных данных в буфер вы управляете буфером. Обратите внимание, что дескриптор наследует состояние от предыдущих вызовов, и буферы должны быть выровнены по значению 8.

Для неявного дескриптора:

void MyType_Encode (MyType __RPC_FAR * pObject);

Для явного дескриптора:

void MyType_Encode (handle_t Handle, MyType __RPC_FAR * pObject);

Следующая функция десериализует данные из хранилища приложения в объект, на который указывает pObject. Маршалированные буферы предоставляются в соответствии с методом, указанным в дескрипторове. Обратите внимание, что дескриптор может наследовать состояние от предыдущих вызовов, и буферы должны быть выровнены по 8.

Для неявного дескриптора:

void MyType_Decode (MyType __RPC_FAR * pObject);

Для явного дескриптора:

void MyType_Decode (handle_t Handle, MyType __RPC_FAR * pObject);

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

Для неявного дескриптора:

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

Для явного дескриптора:

size_t MyType_AlignSize (handle_t Handle, MyType __RPC_FAR * pObject);

Обратите внимание, что обе удаленные процедуры с неявными дескрипторами привязки и сериализованные типы с дескрипторами неявной сериализации используют одну и ту же глобальную переменную дескриптора. Поэтому рекомендуется не смешивать сериализацию типов и удаленные процедуры в интерфейсе с неявными дескрипторами. Дополнительные сведения см. в разделе Неявные и явные дескрипторы.