The user_marshal Attribute

The user_marshal attribute is an ACF type attribute similar in syntax to represent_as. As with the IDL attribute, wire_marshal, it offers a more efficient way to marshal data across a network. As an ACF attribute, user_marshal lets you custom marshal data types that are unknown to MIDL. Each application-specific type has a corresponding transmissible type that defines the wire representation.

Your application-specific type can be a simple, composite, or pointer type. The main restriction is that the type object must have a fixed, well-defined memory size. If the size of your type object needs to change, use a pointer field rather than a conformant array. Alternatively, you can define a pointer to the changeable type.

As with the wire_marshal attribute, you supply routines for the sizing, marshaling, unmarshaling and freeing passes. The following table describes the four user-supplied routine names. The <type> is the userm-type specified in the user_marshal type definition.

Routine Description
<type>_UserSize Sizes the rpc data buffer before marshaling on the client or server side.
<type>_UserMarshal Marshals the data on the client or server side.
<type>_UserUnmarshal Unmarshals the data on the client or server side.
<type>_UserFree Frees the data on the server side.

These user-supplied routines are provided by either the client or the server application, based on the directional attributes.

If the parameter is in only, the client transmits to the server. The client needs the <type>_UserSize and <type>_UserMarshal functions. The server needs the <type>_UserUnmarshal and <type>_UserFree functions.

For an out-only parameter, the server transmits to the client. The server needs the <type>_UserSize and <type>_UserMarshal functions, while the client needs the <type>_UserMarshal function.

See Also

The wire_marshal Attribute, Marshaling Rules for user marshal and wire_marshal, user_marshal, wire_marshal