* Pluggable class resolvers, making it easy to customize classloader
policy, by implementing a small interface (rather than having to subclass
the Object*Stream classes)
* Pluggable object replacement (also without subclassing)
* Pluggable predefined class tables, which can dramatically decrease
stream size and serialization time for stream types which frequently use a
common set of classes
* Pluggable predefined instance tables, which make it easy to handle
remote references
* Pluggable externalizers which may be used to serialize classes
which are not Serializable, or for which an alternate strategy is needed
* Customizable stream headers
* Each marshaller instance is highly configurable and tunable to
maximize performance based on expected usage patterns A generalized API
which can support many different protocol implementations, including
protocols which do not necessarily provide all the above features
* Inexpensive instance creation, beneficial to applications where
many short-lived streams are used
* Support for separate class and instance caches, if the protocol
permits; useful for sending multiple messages or requests with a single
stream, with separate object graphs but retaining the class cache