用於序列化及取消序列化的函數

如果要跨位址空間傳送的事件沒有引數或只將初始類型作為引數(如整數或字元),您必須呼叫函數 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);
}

意見回饋