Udostępnij za pośrednictwem


Serializacja typów

Kompilator MIDL generuje maksymalnie trzy funkcje dla każdego typu, do którego jest stosowany atrybut [kodowania] lub [ dekodowania] . Na przykład w przypadku typu zdefiniowanego przez użytkownika o nazwie MyTypekompilator generuje kod dla funkcji MyType_Encode, MyType_Decode i MyType_AlignSize. W przypadku tych funkcji kompilator zapisuje prototypy w pliku Stub.h i kodzie źródłowym w celu Stub_c.c. Ogólnie rzecz biorąc, można kodować obiekt MyType za pomocą MyType_Encode i dekodować obiekt z buforu przy użyciu MyType_Decode. MyType_AlignSize jest używana, jeśli musisz znać rozmiar buforu marshalingu przed jego przydziałem.

Następująca funkcja kodowania jest generowana przez kompilator MIDL. Ta funkcja serializuje dane obiektu wskazywane przez obiekt pObject, a bufor jest uzyskiwany zgodnie z metodą określoną w dojściu. Po zapisaniu serializowanych danych do buforu należy kontrolować bufor. Należy pamiętać, że uchwyt dziedziczy stan z poprzednich wywołań, a muszą być wyrównane do 8.

W przypadku niejawnego uchwytu:

void MyType_Encode (MyType __RPC_FAR * pObject);

W przypadku jawnego uchwytu:

void MyType_Encode (handle_t Handle, MyType __RPC_FAR * pObject);

Poniższa funkcja deserializuje dane z magazynu aplikacji do obiektu wskazywanego przez obiekt pObject. Należy podać marshalowany bufor zgodnie z metodą określoną w dojściu. Należy pamiętać, że dojście może dziedziczyć stan z poprzednich wywołań, a muszą być wyrównane do 8.

W przypadku niejawnego uchwytu:

void MyType_Decode (MyType __RPC_FAR * pObject);

W przypadku jawnego uchwytu:

void MyType_Decode (handle_t Handle, MyType __RPC_FAR * pObject);

Poniższa funkcja zwraca rozmiar w bajtach, który zawiera wystąpienie typu oraz wszystkie bajty wypełnienia potrzebne do wyrównania danych. Umożliwia to serializowanie zestawu wystąpień tego samego lub różnych typów w buforze przy jednoczesnym zapewnieniu, że dane dla każdego obiektu są odpowiednio wyrównane. MyType_AlignSize zakłada, że wystąpienie wskazywane przez obiekt pObject zostanie przełożone do buforu rozpoczynającego się od przesunięcia wyrównanego do wartości 8.

W przypadku niejawnego uchwytu:

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

W przypadku jawnego uchwytu:

size_t MyType_AlignSize (handle_t Handle, MyType __RPC_FAR * pObject);

Należy pamiętać, że obie procedury zdalne z niejawnymi uchwytami powiązań i serializacji typów z niejawnymi uchwytami serializacji używają tej samej zmiennej obsługi globalnej. Dlatego zaleca się, aby nie mieszać serializacji typów i procedur zdalnych w interfejsie z niejawnymi uchwytami. Aby uzyskać szczegółowe informacje, zobacz Niejawne i jawne dojścia.