All data returned, submitted to, or obtained from RAD APIs adheres to a strong typing system similar to that defined by XDR. For more information about XDR, see XDR: External Data Representation Standard (https://www.rfc-editor.org/info/rfc4506). This makes it simpler to define interfaces that have precise semantics, and makes server extensions (which are written in C) easier to develop. Of course, the rigidity of the typing exposed to an API's consumer is primarily a function of the client language and implementation.
RAD supports the following base types:
A boolean value (true or false).
A 32-bit signed integer value.
A 32-bit unsigned integer value.
A 64-bit signed integer value.
A 64-bit unsigned integer value.
A 32-bit floating-point value.
A 64-bit floating-point value.
A UTF-8 string.
Raw binary data.
An 8-bit clean "character" array. The encoding is defined by the interface using the type. Client/server implementations may take additional steps, for example, zeroing buffers after use, to protect the contents of secret data.
An absolute UTC time value.
The name of an object in the RAD namespace.
A reference to an object.
In addition to the base types, RAD supports the following derived types:
An enumeration is a set of user-defined tokens. Like C enumerations, RAD enumerations may have specific integer values associated with them. Unlike C enumerations, RAD enumerations and integers are not interchangeable. Among other things, this aspect means that an enumeration data value may not take on values outside those defined by the enumeration, which precludes the common but questionable practice of using enumerated types for bitfield values.
An array is an ordered list of data items of a fixed type. Arrays do not have a predefined size.
A structure is a record consisting of a fixed set of typed, uniquely named fields. A field's type may be a base type or derived type, or even another structure type.
Derived types offer almost unlimited flexibility. However, one important constraint imposed on derived types is that recursive type references are prohibited. Thus, complex self-referencing data types, for example, linked lists or trees, must be communicated after being mapped into simpler forms.
In some situations, data might be declared as nullable. Nullable data can take on a "non-value", for example, NULL in C, None in Python, or null in Java. Conversely, non-nullable data cannot be NULL. Only data of type opaque, string, secret, array, or structure might be declared nullable. Additionally, only structure fields and certain API types can be nullable. Specifically, array data cannot be nullable because the array type is actually more like a list than an array.