Serializzazione dei tipi

Il compilatore MIDL genera fino a tre funzioni per ogni tipo a cui viene applicato l'attributo [ encode] o [ decode]. Ad esempio, per un tipo definito dall'utente denominato MyType, il compilatore genera codice per le funzioni MyType_Encode, MyType_Decode e MyType_AlignSize. Per queste funzioni, il compilatore scrive i prototipi in Stub.h e nel codice sorgente in Stub_c.c. In genere, è possibile codificare un oggetto MyType con MyType_Encode e decodificare un oggetto dal buffer usando MyType_Decode. MyType_AlignSize viene usato se è necessario conoscere le dimensioni del buffer di marshalling prima di allocarlo.

La funzione di codifica seguente viene generata dal compilatore MIDL. Questa funzione serializza i dati per l'oggetto a cui punta pObject e il buffer viene ottenuto in base al metodo specificato nell'handle. Dopo aver scritto i dati serializzati nel buffer, è possibile controllare il buffer. Si noti che l'handle eredita lo stato dalle chiamate precedenti e che i buffer devono essere allineati a 8.

Per un handle implicito:

void MyType_Encode (MyType __RPC_FAR * pObject);

Per un handle esplicito:

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

La funzione seguente deserializza i dati dalla risorsa di archiviazione dell'applicazione nell'oggetto a cui punta pObject. Si specifica un buffer sottoposto a marshalling in base al metodo specificato nell'handle. Si noti che l'handle può ereditare lo stato dalle chiamate precedenti e i buffer devono essere allineati a 8.

Per un handle implicito:

void MyType_Decode (MyType __RPC_FAR * pObject);

Per un handle esplicito:

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

La funzione seguente restituisce una dimensione, in byte, che include l'istanza del tipo più eventuali byte di riempimento necessari per allineare i dati. In questo modo è possibile serializzare un set di istanze di tipi uguali o diversi in un buffer assicurando al tempo stesso che i dati per ogni oggetto siano allineati in modo appropriato. MyType_AlignSize presuppone che l'istanza a cui punta pObject venga eseguito il marshalling in un buffer a partire dall'offset allineato a 8.

Per un handle implicito:

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

Per un handle esplicito:

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

Si noti che entrambe le procedure remote con handle di associazione impliciti e tipi serializzati con handle di serializzazione impliciti usano la stessa variabile di handle globale. Pertanto, è consigliabile non combinare la serializzazione dei tipi e le procedure remote in un'interfaccia con handle impliciti. Per informazioni dettagliate, vedere Handle impliciti e espliciti.