Serialización incremental
Al usar la serialización de estilo incremental, se proporcionan tres rutinas para manipular el búfer. Estas rutinas son: asignación, lectura y escritura. La rutina Alloc asigna un búfer del tamaño necesario. La rutina De escritura escribe los datos en el búfer y la rutina De lectura recupera un búfer que contiene datos serializado. Una sola llamada de serialización puede realizar varias llamadas a estas rutinas.
El estilo incremental de serialización usa las rutinas siguientes:
- MesEncodeIncrementalHandleCreate
- MesDecodeIncrementalHandleCreate
- MesIncrementalHandleReset
- MesHandleFree
A continuación se muestran los prototipos de las funciones Alloc, Read y Write que debe proporcionar:
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 */
La entrada de estado de un parámetro para las tres funciones es el puntero definido por la aplicación asociado al identificador de servicios de codificación. La aplicación puede usar este puntero para acceder a la estructura que contiene información específica de la aplicación, como un identificador de archivo o un puntero de secuencia. Tenga en cuenta que los códigos auxiliares no modifican el puntero De estado distinto de pasarlo a las funciones Alloc, Read y Write. Durante la codificación, se llama a Alloc para obtener un búfer en el que se serializan los datos. A continuación, se llama a Write para permitir que la aplicación controle cuándo y dónde se almacenan los datos serializados. Durante la descodificación, se llama a Read para devolver el número solicitado de bytes de datos serializados desde donde la aplicación la almacenó.
Una característica importante del estilo incremental es que el controlador mantiene automáticamente el puntero de estado. Este puntero mantiene el estado y nunca lo tocan las funciones RPC, excepto cuando se pasa el puntero a la función Alloc, Write o Read. El identificador también mantiene un estado interno que permite codificar y descodificar varias instancias de tipo en el mismo búfer agregando relleno según sea necesario para la alineación. La función MesIncrementalHandleReset restablece un identificador a su estado inicial para habilitar la lectura o escritura desde el principio del búfer.
Las funciones Alloc y Write, junto con un puntero definido por la aplicación, están asociadas a un identificador de servicios de codificación mediante una llamada a la función MesEncodeIncrementalHandleCreate . MesEncodeIncrementalHandleCreate asigna la memoria necesaria para el identificador y, a continuación, la inicializa.
La aplicación puede llamar a MesDecodeIncrementalHandleCreate para crear un identificador de descodificación, MesIncrementalHandleReset para reinicializar el identificador o MesHandleFree para liberar la memoria del identificador. La función Read, junto con un parámetro definido por la aplicación, está asociada a un identificador de descodificación mediante una llamada a la rutina MesDecodeIncrementalHandleCreate . La función crea el identificador y lo inicializa.
Los parámetros UserState, Alloc, Write y Read de MesIncrementalHandleReset pueden ser NULL para indicar ningún cambio.