Serialização Incremental

Ao usar a serialização de estilo incremental, você fornece três rotinas para manipular o buffer. Essas rotinas são: Alloc, Read e Write. A rotina Alloc aloca um buffer do tamanho necessário. A rotina de gravação grava os dados no buffer e a rotina de leitura recupera um buffer que contém dados marshaled. Uma única chamada de serialização pode fazer várias chamadas para essas rotinas.

O estilo incremental de serialização usa as seguintes rotinas:

Os protótipos das funções Alloc, Read e Write que você deve fornecer são mostrados abaixo:

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 */

O parâmetro State input a parameter for all three functions is the application-defined pointer that was associated with the encoding services handle. O aplicativo pode usar esse ponteiro para acessar a estrutura que contém informações específicas do aplicativo, como um identificador de arquivo ou ponteiro de fluxo. Observe que os stubs não modificam o ponteiro Estado além de passá-lo para as funções Alloc, Read e Write. Durante a codificação, Alloc é chamado para obter um buffer no qual os dados são serializados. Em seguida, Write é chamado para habilitar o aplicativo a controlar quando e onde os dados serializados são armazenados. Durante a decodificação, Read é chamado para retornar o número solicitado de bytes de dados serializados de onde o aplicativo os armazenou.

Um recurso importante do estilo incremental é que o identificador mantém o ponteiro de estado para você. Esse ponteiro mantém o estado e nunca é tocado pelas funções RPC, exceto ao passar o ponteiro para a função Alloc, Write ou Read. O identificador também mantém um estado interno que possibilita codificar e decodificar várias instâncias de tipo para o mesmo buffer adicionando preenchimento conforme necessário para alinhamento. A função MesIncrementalHandleReset redefine um identificador para seu estado inicial para habilitar a leitura ou gravação desde o início do buffer.

As funções Alloc e Write, juntamente com um ponteiro definido pelo aplicativo, são associadas a um identificador de serviços de codificação por uma chamada para a função MesEncodeIncrementalHandleCreate . MesEncodeIncrementalHandleCreate aloca a memória necessária para o identificador e, em seguida, inicializa-a.

O aplicativo pode chamar MesDecodeIncrementalHandleCreate para criar um identificador de decodificação, MesIncrementalHandleReset para reinicializar o identificador ou MesHandleFree para liberar a memória do identificador. A função Read, juntamente com um parâmetro definido pelo aplicativo, está associada a um identificador de decodificação por uma chamada para a rotina MesDecodeIncrementalHandleCreate . A função cria o identificador e o inicializa.

Os parâmetros UserState, Alloc, Write e Read de MesIncrementalHandleReset podem ser NULL para indicar nenhuma alteração.