Поделиться через


Правила маршалинга для user_marshal и wire_marshal

Спецификация OSF-DCE для маршалинга внедренных типов указателей требует, чтобы при реализации функций>_UserSize типа <, типа <типа>_UserMarshal и <типов>_UserUnMarshal функций. (Приведенные здесь правила и примеры предназначены для маршалинга. Однако процедуры сериализации и демаршалинга должны соответствовать тем же самым ограничениям).

  • Если тип данных является плоским и не содержит указателей, ваша процедура маршалинга для соответствующего типа userm должна просто маршалировать данные в соответствии с макетом типа данных. Например:

    typedef [wire_marshal (long)] void * HANDLE_HANDLE;
    

    Обратите внимание, что тип провода, длинный, это плоский тип. Функция HANDLE_HANDLE_UserMarshal маршалирует длинную всякий раз, когда объект HANDLE_HANDLE передается в него.

  • Если проводной тип является указателем на другой тип, то ваша подпрограмма маршалинга для соответствующего типа userm должна обрабатывать данные в соответствии со структурой типа, на который указывает проводной тип. Подсистема NDR заботится о указателе. Например:

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

    Обратите внимание, что тип провода, WIRE_TYPE, является типом указателя. Функция HANDLE_DATA_UserMarshal маршалирует данные, связанные с дескриптором, с помощью макета HDATA, а не макета HDATA *.

  • Тип провода должен быть типом неструктурированных данных или типом указателя. Если ваш передаваемый тип должен быть чем-то другим (например, структура с указателями), используйте указатель на нужный тип в качестве типа передачи.

Эффект этих ограничений заключается в том, что типы, определенные с атрибутами [wire_marshal] или [user_marshal], могут быть свободно внедрены в другие типы.

wire_marshal

пользователь_маршал

Функция Type_UserSize

функция type_UserMarshal

Thetype_UserUnMarshalFunction

Thetype_UserFreeFunction