シリアル化と非シリアル化の関数

アドレス空間を越えて送信されるイベントが引数を持たない場合、または引数としてプリミティブ型 (integers または chars など) のみを持つ場合、 関数 RiDSendRemoteEvent を呼び出す必要があります。ただし送信されるイベントが引数としてオブジェクトを含んでいる場合は、イベント引数のシリアル化用と非シリアル化の 2 つの関数を提供する必要があります。

シリアル化関数

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; 
}

以下の関数は、パラメーターとして引き渡されたイベント evStart の文字列を保管するために receivedBuffer と呼ぶローカル・バッファーを使用します。

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

フィードバック