An interface for objects whose state can be written/read as
primitive types and strings ("data"). That is, instead of
serializing itself to an ObjectOutputStream, a
DataSerializable can serialize itself to a DataOutput. By implementing this interface, objects can be
serialized faster and in a more compact format than standard Java
serialization. The DataSerializer class contains a number
of static methods that may be helpful to implementations of
DataSerializable.

When possible, GemFire respects the DataSerializable
contract to provide optimal object serialization. For instance, if
a DataSerializable object is
placed into a distributed
cache region, its toData method will be used to
serialize it when it is sent to another member of the distributed
system.

To avoid the overhead of Java reflection,
DataSerializable classes may register an Instantiator to be used during deserialization. Alternatively,
classes that implement DataSerializable can provide a
zero-argument constructor that will be invoked when they are read
with DataSerializer.readObject(java.io.DataInput).

Some classes (especially third-party classes that you may not have
the source code to) cannot be modified to implement
DataSerializable. These classes can be data
serialized by an instance of DataSerializer.

DataSerializable offers improved performance over
standard Java serialization, but does not offer all of the features
of standard Java serialization. In particular, data serialization
does not attempt to maintain referential integrity among the
objects it is writing or reading. As a result, data serialization
should not be used with complex object graphs. Attempting to data
serialize graphs that contain object cycles will result in infinite
recursion and a StackOverflowError. Attempting to
deserialize an object graph that contains multiple reference
paths to the same object will result in multiple copies of the
objects that are referred to through multiple paths.