Типы данных, передаваемые и получаемые от удаленных процедур, могут быть любыми из множества предопределенных типов, либо типом, определенным программистом. RPC работает с произвольными структурами данных, независимо от различий в структуре типов на различных машинах, преобразовывая типы к стандартному формату передачи, который называется внешним представлением данных (XDR). Преобразование из машинного представления в XDR называют сериализацией, а обратный процесс - десериализацией. Аргументы транслятора для rpc_call() и rpc_reg() могут определять примитивную процедуру XDR, например xdr_u_long(), или специальную процедуру программиста, которая обрабатывает полную структуру аргументов. Процедуры обработки аргументов должны принимать только два аргумента: указатель на результат и указатель на обработчик XDR.
Доступны следующие примитивные процедуры XDR для обработки типов данных:
xdr_long() xdr_float() xdr_u_int() xdr_bool()
xdr_short() xdr_double() xdr_u_short() xdr_wrapstring()
xdr_char() xdr_quadruple() xdr_u_char() xdr_void()
В случае собственной процедуры программиста, структура
int a;
short b;
} simple;
#include "simple.h"
bool_t xdr_simple(XDR *xdrsp, struct simple *simplep)
{
if (!xdr_int(xdrsp, &simplep->a))
return (FALSE);
if (!xdr_short(xdrsp, &simplep->b))
return (FALSE);
return (TRUE);
}
Процедура XDR возвращает результат, отличный от нуля, если она завершается успешно, либо 0 в случае ошибки.
Для более сложных структур данных используют готовые процедуры XDR.
xdr_vector() xdr_union() xdr_pointer()
xdr_string() xdr_opaque()
int *data;
int arrlnth;
} arr;
{
return(xdr_array(xdrsp, (caddr_t)&arrp->data,
(u_int *)&arrp->arrlnth, MAXLEN, sizeof(int), xdr_int));
}
bool_t xdr_intarr(XDR *xdrsp, int intarr[])
{
return (xdr_vector(xdrsp, intarr, SIZE, sizeof(int), xdr_int));
}
Строки, законченные пустым указателем, транслируются с помощью xdr_string(). Она сходна с xdr_bytes(), но без параметра длины. При сериализации процедура получает длину строки из strlen(), а при десериализации создает законченную пустым указателем строку.
xdr_reference() вызывает встроенные функции xdr_string() и xdr_reference(), которые преобразуют указатели, для передачи строки, и struct simple из предыдущего примера. Пример использования xdr_reference() (рис. 37):
char *string;
struct simple *simplep;
} finalexample;
bool_t xdr_finalexample(XDR *xdrsp, struct finalexample *finalp)
{
if (!xdr_string(xdrsp, &finalp->string, MAXSTRLEN))
return (FALSE);
if (!xdr_reference( xdrsp, &finalp->simplep, sizeof(struct simple),
xdr_simple)) return (FALSE);
return (TRUE);
}
Процедура thatxdr_simple(), должна вызываться вместо xdr_reference().