Serialização de tipo

O compilador MIDL gera até três funções para cada tipo ao qual o atributo [ codificação] ou [ decodificação] é aplicado. Por exemplo, para um tipo definido pelo usuário chamado MyType, o compilador gera código para as funções MyType_Encode, MyType_Decode e MyType_AlignSize. Para essas funções, o compilador grava protótipos no Stub.h e no código-fonte em Stub_c.c. Em geral, você pode codificar um objeto MyType com MyType_Encode e decodificar um objeto do buffer usando MyType_Decode. MyType_AlignSize será usado se você precisar saber o tamanho do buffer de marshaling antes de alocá-lo.

A função de codificação a seguir é gerada pelo compilador MIDL. Essa função serializa os dados do objeto apontado por pObject e o buffer é obtido de acordo com o método especificado no identificador. Depois de gravar os dados serializados no buffer, você controla o buffer. Observe que o identificador herda o status das chamadas anteriores e os buffers devem ser alinhados em 8.

Para um identificador implícito:

void MyType_Encode (MyType __RPC_FAR * pObject);

Para um identificador explícito:

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

A função a seguir desserializa os dados do armazenamento do aplicativo no objeto apontado por pObject. Você fornece um buffer marshaled de acordo com o método especificado no identificador. Observe que o identificador pode herdar o status das chamadas anteriores e os buffers devem ser alinhados em 8.

Para um identificador implícito:

void MyType_Decode (MyType __RPC_FAR * pObject);

Para um identificador explícito:

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

A função a seguir retorna um tamanho, em bytes, que inclui a instância de tipo mais todos os bytes de preenchimento necessários para alinhar os dados. Isso permite serializar um conjunto de instâncias dos mesmos tipos ou diferentes em um buffer, garantindo que os dados de cada objeto estejam alinhados adequadamente. MyType_AlignSize pressupõe que a instância apontada por pObject será marshalada em um buffer começando no deslocamento alinhado a 8.

Para um identificador implícito:

size_t MyType_AlignSize (MyType __RPC_FAR * pObject);

Para um identificador explícito:

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

Observe que ambos os procedimentos remotos com identificadores de associação implícita e tipos serializados com identificadores de serialização implícitos usam a mesma variável de identificador global. Portanto, é aconselhável não misturar serialização de tipo e procedimentos remotos em uma interface com identificadores implícitos. Para obter detalhes, consulte Identificadores Implícitos versus explícitos.