Inkrementelle Serialisierung
Wenn Sie die inkrementelle Serialisierung im Stil 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 tätigen.
Der inkrementelle Serialisierungsstil verwendet die folgenden Routinen:
- MesEncodeIncrementalHandleCreate
- MesDecodeIncrementalHandleCreate
- MesIncrementalHandleReset
- MesHandleFree
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 Zustandseingabe ein Parameter für alle drei Funktionen ist der anwendungsdefinierte Zeiger, der dem Handle für Codierungsdienste zugeordnet war. Die Anwendung kann mit diesem Zeiger auf die Struktur zugreifen, die anwendungsspezifische Informationen enthält, z. B. ein Dateihand handle oder ein Streamzeiger. Beachten Sie, dass die Stubs den Zustandszeiger 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ück zu geben, von denen die Anwendung sie gespeichert hat.
Ein wichtiges Feature des inkrementellen Stils ist, dass das Handle den Zustandszeiger für Sie bei sich behält. Dieser Zeiger behält den Zustand bei und wird nie von den RPC-Funktionen berührt, es sei denn, der Zeiger wird an die Alloc-, Write- oder Read-Funktion übergeben. Das Handle behält auch einen internen Zustand bei, der es ermöglicht, mehrere Typinstanzen im selben Puffer zu codieren und zu decodieren, indem bei Bedarf Auf padding für die Ausrichtung hinzugefügt wird. Die MesIncrementalHandleReset-Funktion setzt ein Handle auf seinen Ursprünglichen Zustand zurück, um das Lesen oder Schreiben vom Anfang des Puffers aus zu ermöglichen.
Die Funktionen Alloc und Write werden zusammen mit einem anwendungsdefinierten Zeiger einem Encoding Services-Handle durch einen Aufruf der MesEncodeIncrementalHandleCreate-Funktion zugeordnet. MesEncodeIncrementalHandleCreate weist 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 Arbeitsspeicher des Handles freizubewegen. Die Read-Funktion wird zusammen mit einem anwendungsdefinierten Parameter einem Decodierungshandle durch einen Aufruf der MesDecodeIncrementalHandleCreate-Routine zugeordnet. Die Funktion erstellt das Handle und initialisiert es.
Die Parameter UserState, Alloc, Write und Read von MesIncrementalHandleReset können NULL sein, um auf keine Änderung hindeuten zu können.