Freigeben über


Inkrementelle Serialisierung

Wenn Sie die inkrementelle Serialisierung verwenden, geben Sie drei Routinen an, um den Puffer zu bearbeiten. Diese Routinen sind: Alloc, Read und Write. Die Alloc-Routine weist einen Puffer der erforderlichen Größe zu. Die Schreibroutine schreibt die Daten in den Puffer, und die Leseroutine ruft einen Puffer ab, der gemarshallte Daten enthält. Ein einzelner Serialisierungsaufruf kann mehrere Aufrufe dieser Routinen ausführen.

Der inkrementelle Serialisierungsstil verwendet die folgenden Routinen:

Die Prototypen für die Funktionen Alloc, Read und Write, die Sie bereitstellen müssen, sind unten dargestellt:

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 */

Die State-Eingabe eines Parameters für alle drei Funktionen ist der anwendungsdefinierte Zeiger, der dem Codierungsdiensthandle zugeordnet wurde. Die Anwendung kann mit diesem Zeiger auf die Struktur zugreifen, die anwendungsspezifische Informationen enthält, z. B. ein Dateihandle oder einen Streamzeiger. Beachten Sie, dass die Stubs den Statuszeiger nur ändern, um ihn an die Funktionen Alloc, Read und Write zu übergeben. Während der Codierung wird Alloc aufgerufen, um einen Puffer zu erhalten, in den die Daten serialisiert werden. Anschließend wird Write aufgerufen, damit die Anwendung steuern kann, wann und wo die serialisierten Daten gespeichert werden. Während der Decodierung wird Read aufgerufen, um die angeforderte Anzahl von Bytes serialisierter Daten zurückzugeben, aus denen die Anwendung sie gespeichert hat.

Ein wichtiges Feature des inkrementellen Stils ist, dass das Handle den Statuszeiger für Sie behält. Dieser Zeiger behält den Zustand bei und wird von den RPC-Funktionen nie berührt, außer wenn der Zeiger auf die Alloc-, Write- oder Read-Funktion übergeben wird. Das Handle verwaltet auch einen internen Zustand, der es ermöglicht, mehrere Typinstanzen in denselben Puffer zu codieren und zu decodieren, indem nach Bedarf ein Abstand für die Ausrichtung hinzugefügt wird. Die MesIncrementalHandleReset-Funktion setzt ein Handle auf den Ursprünglichen Zustand zurück, um lese- oder schreibvorgänge vom Anfang des Puffers aus zu ermöglichen.

Die Funktionen Alloc und Write werden zusammen mit einem anwendungsdefinierten Zeiger durch einen Aufruf der MesEncodeIncrementalHandleCreate-Funktion einem CodierungsdiensthandleCreate-Handle zugeordnet. MesEncodeIncrementalHandleCreate ordnet den für das Handle erforderlichen Arbeitsspeicher zu und initialisiert ihn dann.

Die Anwendung kann MesDecodeIncrementalHandleCreate aufrufen, um ein Decodierungshandle zu erstellen, MesIncrementalHandleReset zum erneuten Initialisieren des Handles oder MesHandleFree , um den Speicher des Handles freizugeben. Die Read-Funktion wird zusammen mit einem anwendungsdefinierten Parameter durch einen Aufruf der MesDecodeIncrementalHandleCreate-Routine einem Decodierungshandle zugeordnet. Die Funktion erstellt das Handle und initialisiert es.

Die Parameter UserState, Alloc, Write und Read von MesIncrementalHandleReset können NULL sein, um keine Änderung anzuzeigen.