序列化函数和反序列化函数

如果要跨地址空间发送的事件没有自变量或者只将基本类型(例如整数或字符)用作自变量,那么您必须调用 RiDSendRemoteEvent 函数。但是,如果要发送的事件包括对象作为自变量,那么还必须提供两个函数 - 一个函数用于对事件自变量进行序列化,另一个函数用于对事件自变量进行反序列化:

序列化函数

RhpAddress evStartSerialize(struct RiCEvent* const ev, const RhpAddress 
buffer, RhpPositive bufferSize, RhpPositive* resultBufferSize);

返回值 - 这是指向序列化事件的指针

ev - 这是指向要序列化的事件的指针

buffer - 这是一个局部缓冲区,可用于存储序列化事件(用户可以改为分配他们自己的缓冲区)

bufferSize - 参数 buffer 的大小(以字节计)

resultBufferSize - 这是一个指针,用于存储所返回的序列化事件的大小

反序列化函数

RiCEvent* evStartUnserialize(RhpAddress const serializedBuffer, RhpPositive serializedBufferSize);

返回值 - 这是指向反序列化事件的指针

serializedBuffer - 这是指向序列化缓冲区的指针

serializedBufferSize - 参数 serializedBuffer 的大小

序列化函数和反序列化函数的示例

此示例引用了事件 evStart,此事件的定义如下所示:

struct evStart {
   RiCEvent ric_event;
   /*** User explicit entries ***/
   char* msg;
};
RhpAddress evStartSerialize(struct RiCEvent* const ev, const RhpAddress 
buffer, RhpPositive bufferSize, RhpPositive* resultBufferSize) 
{  
        evStart* castedEv = (evStart*)ev;
        RhpPositive msgLength = strlen(castedEv->msg);
        /* Testing the size of the message parameter against the size of local 
buffer */
        if (bufferSize <= msgLength)
        {
              /* buffer too small - serialization is aborted */
              return NULL; 
        }
        /* copy the message string + the null terminating */
        memcpy(buffer, castedEv->msg, msgLength + 1);
        *resultBufferSize = msgLength + 1;
        return buffer; 
}

以下函数使用名为 receivedBuffer 的局部缓冲区来存储作为参数传递的事件 evStart 的字符串。

RiCEvent* evStartUnserialize(RhpAddress const serializedBuffer, 
RhpPositive serializedBufferSize) {
        /* copy the message to a local buffer */
        memcpy(receivedBuffer, serializedBuffer, serializedBufferSize);
        return (RiCEvent*)RiC_Create_evStart(receivedBuffer);
}

反馈