The third protocol used was SOAP RMI, which is an early implementation of RMI based on nanoSOAP, our implementation of a simple SOAPv1.0 serialization and deserialization mechanism. SOAP RMI uses an XML-Schema specification of the server interface to generate the associated stubs and skeletons. A remote object reference is an HTTP URL along with information that uniquely identifies the instance. The stubs and skeletons do not directly interact with the SOAP implementation, but instead use a communication object which is an abstraction that helps hide the underlying implementation of SOAP. This design is useful as it allows run-time insertion of different SOAP implementations. The tests were executed for only up to 10,000 objects. Memory limitations prevented larger test sizes; for example, in Sun RMI the recursion stack depth of around 1000 was a limiting factor. We were able to run bigger sizes only by adjusting the stack size option (-Xss) for the Java virtual machine, which can affect performance.