Добавочная сериализация
При использовании добавочной сериализации в стиле вы предоставляете три подпрограммы для управления буфером. К этим подпрограммам относятся: "Распределить", "Чтение" и "Запись". Подпрограмма Alloc выделяет буфер требуемого размера. Подпрограмма записи записывает данные в буфер, а подпрограмма Чтения извлекает буфер, содержащий маршалированные данные. Один вызов сериализации может выполнять несколько вызовов к этим подпрограммам.
В добавочном стиле сериализации используются следующие подпрограммы:
- MesEncodeIncrementalHandleCreate
- MesDecodeIncrementalHandleCreate
- MesIncrementalHandleReset
- MesHandleFree
Ниже приведены прототипы функций 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 */
Параметр State input для всех трех функций — это определяемый приложением указатель, связанный с дескриптором служб кодирования. Приложение может использовать этот указатель для доступа к структуре, содержащей сведения о приложении, например дескриптор файла или указатель потока. Обратите внимание, что заглушки не изменяют указатель Состояния, кроме как для передачи его в функции Alloc, Read и Write. Во время кодирования метод Alloc вызывается для получения буфера, в который сериализуются данные. Затем вызывается запись, чтобы позволить приложению контролировать, когда и где хранятся сериализованные данные. Во время декодирования вызывается метод Read, чтобы вернуть запрошенное количество байтов сериализованных данных, из которого приложение сохранило их.
Важной особенностью добавочного стиля является то, что дескриптор сохраняет указатель состояния. Этот указатель сохраняет состояние и никогда не касается функций RPC, за исключением случаев передачи указателя на функцию Alloc, Write или Read. Дескриптор также поддерживает внутреннее состояние, которое позволяет кодировать и декодировать несколько экземпляров типов в одном буфере, добавляя заполнение по мере необходимости для выравнивания. Функция MesIncrementalHandleReset сбрасывает дескриптор в исходное состояние, чтобы включить чтение или запись с начала буфера.
Функции Alloc и Write вместе с указателем, определяемым приложением, связаны с дескриптором служб кодирования путем вызова функции MesEncodeIncrementalHandleCreate . MesEncodeIncrementalHandleCreate выделяет память, необходимую для дескриптора, а затем инициализирует его.
Приложение может вызвать MesDecodeIncrementalHandleCreate для создания декодирования дескриптора, MesIncrementalHandleReset для повторной инициализации дескриптора или MesHandleFree , чтобы освободить память дескриптора. Функция Read вместе с параметром, определяемым приложением, связана с дескриптором декодирования путем вызова подпрограммы MesDecodeIncrementalHandleCreate . Функция создает дескриптор и инициализирует его.
Параметры UserState, Alloc, Write и Read объекта MesIncrementalHandleReset могут иметь значение NULL , что указывает на отсутствие изменений.