JBoss Marshalling is an alternative serialization API that fixes many of the problems found in the JDK serialization API while remaining fully compatible with java.io.Serializable and its relatives as well as the binary serialization, and adds several new tunable parameters and additional features, all of which are pluggable via factory configuration (externalizers, class/instance lookup tables, class resolution, and object replacement, to name a few). In addition, a highly optimized protocol entitled "River" is included as well, which retains the serialization API compatibility but results in much smaller messages which are more quickly read and written.
This framework was inspired by the need for certain features unavailable with the standard Object*Stream classes:
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