Serializacja przyrostowa
W przypadku używania serializacji stylu przyrostowego należy podać trzy procedury do manipulowania buforem. Te procedury to: Alloc, Read i Write. Rutyna Alloc przydziela bufor wymaganego rozmiaru. Rutynowa funkcja Zapisu zapisuje dane w buforze, a rutynowa odczyt pobiera bufor zawierający dane marshaldowane. Jedno wywołanie serializacji może wykonywać kilka wywołań tych procedur.
Styl przyrostowy serializacji używa następujących procedur:
- MesEncodeIncrementalHandleCreate
- MesDecodeIncrementalHandleCreate
- MesIncrementalHandleReset
- MesHandleFree
Poniżej przedstawiono prototypy funkcji Alloc, Read i Write, które należy podać:
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 */
Stan wejściowy parametr dla wszystkich trzech funkcji jest wskaźnikiem zdefiniowanym przez aplikację, który został skojarzony z dojściem usług kodowania. Aplikacja może użyć tego wskaźnika, aby uzyskać dostęp do struktury zawierającej informacje specyficzne dla aplikacji, takie jak uchwyt pliku lub wskaźnik strumienia. Należy pamiętać, że wycinki nie modyfikują wskaźnika Stanu innego niż przekazywanie go do funkcji Alloc, Read i Write. Podczas kodowania element Alloc jest wywoływany w celu uzyskania buforu, w którym dane są serializowane. Następnie funkcja Zapisu jest wywoływana w celu umożliwienia aplikacji kontrolowania czasu i miejsca przechowywania serializowanych danych. Podczas dekodowania odczyt jest wywoływany w celu zwrócenia żądanej liczby bajtów serializowanych danych, z których aplikacja je przechowywała.
Ważną cechą stylu przyrostowego jest to, że uchwyt zachowuje wskaźnik stanu. Ten wskaźnik utrzymuje stan i nigdy nie jest dotykany przez funkcje RPC, z wyjątkiem przekazywania wskaźnika do funkcji Alloc, Write lub Read. Uchwyt utrzymuje również stan wewnętrzny, który umożliwia kodowanie i dekodowanie kilku wystąpień typu do tego samego buforu przez dodanie dopełnienia zgodnie z potrzebami w celu wyrównania. Funkcja MesIncrementalHandleReset resetuje uchwyt do stanu początkowego, aby włączyć odczyt lub zapis od początku buforu.
Funkcje Alloc i Write wraz ze wskaźnikiem zdefiniowanym przez aplikację są skojarzone z obsługą usług kodowania przez wywołanie funkcji MesEncodeIncrementalHandleCreate. MesEncodeIncrementalHandleCreate przydziela pamięć potrzebną do dojścia, a następnie inicjuje ją.
Aplikacja może wywołać MesDecodeIncrementalHandleCreate w celu utworzenia uchwytu dekodowania, MesIncrementalHandleReset w celu ponownego zainicjowania uchwytu lub MesHandleFree w celu zwolnienia pamięci uchwytu. Funkcja Read wraz z parametrem zdefiniowanym przez aplikację jest skojarzona z uchwytem dekodowania przez wywołanie procedury MesDecodeIncrementalHandleCreate. Funkcja tworzy uchwyt i inicjuje go.
Parametry UserState, Alloc, Write i Read MesIncrementalHandleReset mogą być null, aby nie wskazać żadnej zmiany.