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


Добавочная сериализация

При использовании добавочной сериализации стиля вы предоставляете три подпрограммы для управления буфером. Эти подпрограммы: Alloc, Read и Write. Подпрограмма Alloc выделяет буфер требуемого размера. Подпрограмма записи записывает данные в буфер, а подпрограмма чтения извлекает буфер, содержащий маршалированные данные. Один вызов сериализации может выполнять несколько вызовов этих подпрограмм.

Добавочный стиль сериализации использует следующие подпрограммы:

Ниже приведены прототипы функций Alloc, Read и Write, которые необходимо предоставить:

void __RPC_USER Alloc (
   void *State,          /* application-defined pointer */
   char **pBuffer,       /* returns pointer to allocated buffer */
   unsigned int *pSize); /* inputs requested bytes; outputs 
                         /* pBuffer size */

void __RPC_USER Write (
   void *State,          /* application-defined pointer */
   char *Buffer,         /* buffer with serialized data */
   unsigned int Size);   /* number of bytes to write from Buffer */

void __RPC_USER Read (
   void *State,          /* application-defined pointer */
   char **pBuffer,       /* returned pointer to buffer with data */
   unsigned int *pSize); /* number of bytes to read into pBuffer */

Входной параметр состояния для всех трех функций — это определяемый приложением указатель, связанный с дескриптором служб кодирования. Приложение может использовать этот указатель для доступа к структуре, содержащей сведения о приложении, например дескриптор файла или указатель потока. Обратите внимание, что заглушки не изменяют указатель состояния, отличный от передачи его функциям Alloc, Read и Write. Во время кодирования Alloc вызывается для получения буфера, в который сериализуются данные. Затем вызывается запись, чтобы приложение контролировало, когда и где хранятся сериализованные данные. Во время декодирования вызывается чтение, чтобы вернуть запрошенное количество байтов сериализованных данных, из которых оно хранится.

Важной особенностью добавочного стиля является то, что дескриптор сохраняет указатель состояния для вас. Этот указатель поддерживает состояние и никогда не касается функций RPC, за исключением передачи указателя на функцию Alloc, Write или Read. Дескриптор также поддерживает внутреннее состояние, которое позволяет кодировать и декодировать несколько экземпляров типов в один и тот же буфер, добавляя заполнение по мере необходимости для выравнивания. Функция MesIncrementalHandleReset сбрасывает дескриптор в исходное состояние, чтобы включить чтение или запись с начала буфера.

Функции Alloc и Write вместе с определяемым приложением указателем связаны с дескриптором служб кодирования вызовом функции MesEncodeIncrementalHandleCreate. MesEncodeIncrementalHandleCreate выделяет память, необходимую для дескриптора, а затем инициализирует ее.

Приложение может вызывать MesDecodeIncrementalHandleCreate для создания декодирования декодирования, MesIncrementalHandleReset для повторной инициализации дескриптора или MesHandleFree для освобождения памяти дескриптора. Функция чтения, а также определяемый приложением параметр, связана с декодирования дескриптором вызовом подпрограммы MesDecodeIncrementalHandleCreate. Функция создает дескриптор и инициализирует его.

Параметры UserState, Alloc, Write и Read MesIncrementalHandleReset могут быть NULL для указания отсутствия изменений.