增量序列化

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

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

必须提供的 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 以获取序列化数据的缓冲区。 然后,调用“写入”,使应用程序能够控制序列化数据的存储和位置。 在解码过程中,调用 Read 以返回应用程序存储数据的所请求的序列化数据的字节数。

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

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

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

MesIncrementalHandleReset 的 UserState、Alloc、Write 和 Read 参数可以为 NULL,表示无更改。