Partager via


Sérialisation de type

Le compilateur MIDL génère jusqu’à trois fonctions pour chaque type auquel l’attribut [ encode] ou [ décoder] est appliqué. Par exemple, pour un type défini par l’utilisateur nommé MyType, le compilateur génère du code pour les fonctions MyType_Encode, MyType_Decode et MyType_AlignSize. Pour ces fonctions, le compilateur écrit des prototypes dans Stub.h et du code source dans Stub_c.c. En règle générale, vous pouvez encoder un objet MyType avec MyType_Encode et décoder un objet à partir de la mémoire tampon à l’aide de MyType_Decode. MyType_AlignSize est utilisé si vous devez connaître la taille de la mémoire tampon de marshaling avant de l’allouer.

La fonction d’encodage suivante est générée par le compilateur MIDL. Cette fonction sérialise les données de l’objet pointé par pObject, et la mémoire tampon est obtenue en fonction de la méthode spécifiée dans le handle. Après avoir écrit les données sérialisées dans la mémoire tampon, vous contrôlez la mémoire tampon. Notez que le handle hérite de l’état des appels précédents et que les mémoires tampons doivent être alignées à 8.

Pour un handle implicite :

void MyType_Encode (MyType __RPC_FAR * pObject);

Pour un handle explicite :

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

La fonction suivante désérialise les données du stockage de l’application dans l’objet pointé par pObject. Vous fournissez une mémoire tampon marshalée en fonction de la méthode spécifiée dans le handle. Notez que le handle peut hériter de l’état des appels précédents et que les mémoires tampons doivent être alignées à 8.

Pour un handle implicite :

void MyType_Decode (MyType __RPC_FAR * pObject);

Pour un handle explicite :

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

La fonction suivante retourne une taille, en octets, qui inclut l’instance de type ainsi que les octets de remplissage nécessaires pour aligner les données. Cela permet de sérialiser un ensemble d’instances de types identiques ou différents dans une mémoire tampon tout en garantissant que les données de chaque objet sont correctement alignées. MyType_AlignSize suppose que l’instance pointée par pObject sera marshalée dans une mémoire tampon commençant par le décalage aligné à 8.

Pour un handle implicite :

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

Pour un handle explicite :

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

Notez que les deux procédures distantes avec des handles de liaison implicite et des types sérialisés avec des handles de sérialisation implicite utilisent la même variable de handle globale. Par conséquent, il est conseillé de ne pas combiner la sérialisation de type et les procédures distantes dans une interface avec des handles implicites. Pour plus d’informations, consultez handles implicites et explicites.