增量序列化

使用增量样式序列化时,提供三个用于作缓冲区的例程。 这些例程包括:Alloc、Read 和 Write。 Alloc 例程分配所需大小的缓冲区。 Write 例程将数据写入缓冲区,Read 例程检索包含封送数据的缓冲区。 单个序列化调用可以对这些例程进行多个调用。

序列化的增量样式使用以下例程:

必须提供的 Alloc、读取和写入函数的原型如下所示:

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 以获取数据序列化到其中的缓冲区。 然后,调用 Write,使应用程序能够控制序列化数据的存储时间和位置。 在解码期间,调用 Read 以返回应用程序从中存储数据的已请求的序列化数据的字节数。

增量样式的一个重要功能是句柄为你保留状态指针。 此指针维护状态,RPC 函数永远不会触摸,除非将指针传递给 Alloc、Write 或 Read 函数。 句柄还维护一个内部状态,通过根据需要添加对齐填充,可以将多个类型实例编码和解码到同一缓冲区。 MesIncrementalHandleReset 函数将句柄重置为其初始状态,以启用从缓冲区开头读取或写入。

Alloc 和 Write 函数以及应用程序定义的指针通过调用 MesEncodeIncrementalHandleCreate 函数与编码服务句柄相关联。 MesEncodeIncrementalHandleCreate 分配句柄所需的内存,然后初始化它。

应用程序可以调用 MesDecodeIncrementalHandleCreate 来创建解码句柄,MesIncrementalHandleReset 重新初始化句柄,或 MesHandleFree 释放句柄的内存。 Read 函数以及应用程序定义的参数通过调用 MesDecodeIncrementalHandleCreate 例程与解码句柄相关联。 该函数创建句柄并初始化它。

MesIncrementalHandleReset 的 UserState、Alloc、Write 和 Read 参数可以 NULL 指示没有更改。