org.apache.geode

## Interface DataSerializable

- All Superinterfaces:
    java.io.Serializable
  All Known Subinterfaces:
    CollectionType, MapType, ObjectType, PersistentID, StructType
  All Known Implementing Classes:
    AbstractGatewayDeltaEvent, BootstrappingFunction, CollectionHolder, CreateRegionFunction, DeltaSession, DeltaSession7, DeltaSession8, DeltaTestImpl, EvictionAttributes, ExpirationAttributes, GatewayDeltaCreateEvent, GatewayDeltaDestroyEvent, MembershipAttributes, Person, Portfolio, Position, RegionConfiguration, RegionSizeFunction, RegionSubRegionSnapshot, ServerLoad, SubscriptionAttributes, TestObject, TouchPartitionedRegionEntriesFunction, TouchReplicatedRegionEntriesFunction

      public interface DataSerializable
      extends java.io.Serializable

  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.

  Since:
    GemFire 3.5
  See Also:
    `Serializable`, `DataSerializer`, `Instantiator`

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Interface and Description
    --- | ---
    `static interface` | `DataSerializable.Replaceable` `Replaceable` allows an object to write an alternative version of itself to a `DataOutput`.

  - ### Method Summary

    All Methods Instance Methods Abstract Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `fromData(java.io.DataInput in)` Reads the state of this object as primitive data from the given `DataInput`.
    `void` | `toData(java.io.DataOutput out)` Writes the state of this object as primitive data to the given `DataOutput`.

- - ### Method Detail

    - #### toData

          void toData(java.io.DataOutput out)
               throws java.io.IOException

      Writes the state of this object as primitive data to the given `DataOutput`.

      Since 5.7 it is possible for any method call to the specified `DataOutput` to throw `GemFireRethrowable`. It should not be caught by user code. If it is it must be rethrown.

      Throws:
        `java.io.IOException` - A problem occurs while writing to `out`

    - #### fromData

          void fromData(java.io.DataInput in)
                 throws java.io.IOException,
                        java.lang.ClassNotFoundException

      Reads the state of this object as primitive data from the given `DataInput`.
      Throws:
        `java.io.IOException` - A problem occurs while reading from `in`
        `java.lang.ClassNotFoundException` - A class could not be loaded while reading from `in`