Compartir a través de


Serialización de reglas para user_marshal y wire_marshal

La especificación OSF-DCE para serializar tipos de puntero incrustados requiere que observe las siguientes restricciones al implementar el <tipo_UserSize, <el tipo>_UserMarshal y <las funciones type>>_UserUnMarshal. (Las reglas y ejemplos que se proporcionan aquí son para serializar. Sin embargo, las rutinas de ajuste de tamaño y desacoplado deben seguir las mismas restricciones):

  • Si el tipo de cable es un tipo plano sin punteros, la rutina de cálculo de referencias para el tipo userm correspondiente simplemente debe calcular las referencias de los datos según el diseño del tipo de cable. Por ejemplo:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Tenga en cuenta que el tipo de cable, long, es un tipo plano. La función HANDLE_HANDLE_UserMarshal serializa un valor largo siempre que se le pasa un objeto HANDLE_HANDLE.

  • Si el tipo de cable es un puntero a otro tipo, la rutina de serialización del tipo userm correspondiente debe serializar los datos según el diseño del tipo al que apunta el tipo de cable. El motor NDR se encarga del puntero. Por ejemplo:

    typedef struct HDATA
    {
        long size;
        [size_is(size)] long * pData;
    } HDATA;
    
    typedef HDATA * WIRE_TYPE;
    typedef [wire_marshal(WIRE_TYPE)] void * HANDLE_DATA;
    

    Tenga en cuenta que el tipo de cable, WIRE_TYPE, es un tipo de puntero. La función HANDLE_DATA_UserMarshal calcula las referencias de los datos relacionados con el identificador, mediante el diseño de HDATA, en lugar del diseño de HDATA * .

  • Un tipo de cable debe ser un tipo de datos plano o un tipo de puntero. Si el tipo transmisible debe ser algo más (una estructura con punteros, por ejemplo), use un puntero al tipo deseado como tipo de cable.

El efecto de estas restricciones es que los tipos definidos con los atributos [wire_marshal] o [user_marshal] se pueden incrustar libremente en otros tipos.

wire_marshal

user_marshal

Función type_UserSize

Función type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction