1. A computer-implemented method for creating a user-defined type in a database system, comprising: receiving code that executes on a processing unit and that implements a class defining the structure of a user-defined type and methods that can be invoked on instances of the user-defined type; enforcing a contract against the class to ensure that the user-defined type will act like any scalar type of the database system, the contract comprising: a first requirement that the class specify one of a plurality of different formats for persisting instances of the user-defined type in a database store, the plurality of different formats comprising at least a first format in which an instance of the user-defined type is automatically serialized in accordance with a native format of the database system and a second format in which an instance of the user-defined type is serialized in a manner defined by the class; a second requirement that the class be capable of returning a null value for the user-defined type; and a third requirement that the class provide a method for converting the user-defined type to another type; storing metadata about the user-defined type for subsequent use by the database system in creating instances of the user-defined type; and creating instances of the user-defined type only when the class meets the requirements of the contract.
4. The method of claim 1 , further comprising: receiving an expression in the query language of the database system, wherein evaluation of the expression requires invocation of a method of an instance of the user-defined type; translating the expression into a sequence of program code instructions that invoke the required method on the instance of the user-defined type; invoking the method upon execution of the program code; and returning a result of the method invocation as the evaluation of the query language expression.