增量序列化

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

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

必须提供的 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 输入参数都是与编码服务句柄关联的应用程序定义的指针。 应用程序可以使用此指针访问包含应用程序特定信息(例如文件句柄或流指针)的结构。 请注意,存根不会修改 State 指针,而不是将其传递给 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,表示没有更改。