Package org.apache.geode
Class Instantiator
java.lang.Object
org.apache.geode.Instantiator
- Direct Known Subclasses:
CanonicalInstantiator
Instantiator allows classes that implement DataSerializable to be registered with
the data serialization framework. Knowledge of DataSerializable classes allows the
framework to optimize how instances of those classes are data serialized.
Ordinarily, when a DataSerializable object is written using
DataSerializer.writeObject(Object, java.io.DataOutput), a special marker class id is
written to the stream followed by the class name of the DataSerializable object. After
the marker class id is read by DataSerializer.readObject(java.io.DataInput) it performs the following
operations,
- The class name is read
- The class is loaded using
Class.forName(java.lang.String) - An instance of the class is created using reflection
DataSerializable.fromData(java.io.DataInput)is invoked on the newly-created object
DataSerializable class is registered
with the data serialization framework and assigned a unique class id, an important optimization
can be performed that avoid the expense of using reflection to instantiate the
DataSerializable class. When the object is written using
DataSerializer.writeObject(Object, java.io.DataOutput), the object's registered class id
is written to the stream. Consequently, when the data is read from the stream, the
newInstance() method of the appropriate Instantiator instance is invoked to create
an "empty" instance of the DataSerializable instead of using reflection to create the new
instance.
Commonly, a DataSerializable class will register itself with the Instantiator in
a static initializer as shown in the below example code.
public class User implements DataSerializable {
private String name;
private int userId;
static {
Instantiator.register(new Instantiator(User.class, 45) {
public DataSerializable newInstance() {
return new User();
}
});
}
public User(String name, int userId) {
this.name = name;
this.userId = userId;
}
/**
Creates an "empty" User whose contents are filled in by
invoking its toData() method
/
private User() {
}
public void toData(DataOutput out) throws IOException {
out.writeUTF(this.name);
out.writeInt(this.userId);
}
public void fromData(DataInput in)
throws IOException, ClassNotFoundException {
this.name = in.readUTF();
this.userId = in.readInt();
}
}
Instantiators may be distributed to other members of the distributed system when they are
registered. Consider the following scenario in which VM1 and VM2 are members of the same
distributed system. Both VMs define the sameRegion and VM2's region replicates the contents of
VM1's using replication. VM1 puts an instance of the above User class into the region.
The act of instantiating User will load the User class and invoke its static
initializer, thus registering the Instantiator with the data serialization framework.
Because the region is a replicate, the User will be data serialized and sent to VM2.
However, when VM2 attempts to data deserialize the User, its Instantiator will
not necessarily be registered because User's static initializer may not have been invoked
yet. As a result, an exception would be logged while deserializing the User and the
replicate would not appear to have the new value. So, in order to ensure that the
Instantiator is registered in VM2, the data serialization framework distributes a message
to each member when an Instantiator is registered.
Note that the framework does not require that an Instantiator be
Serializable, but it does require that it provide a
two-argument constructor.
- Since:
- GemFire 3.5
- See Also:
-
Constructor Summary
ConstructorsConstructorDescriptionInstantiator(Class<? extends DataSerializable> c, int classId) Creates a newInstantiatorthat instantiates a given class. -
Method Summary
Modifier and TypeMethodDescriptionReturns the context of thisInstantiator.Returns the uniqueeventIdof thisInstantiator.intgetId()Returns the uniqueidof thisInstantiator.Class<? extends DataSerializable>Returns theDataSerializableclass that is instantiated by thisInstantiator.abstract DataSerializableCreates a new "empty" instance of aDataSerializableclass whose state will be filled in by invoking itsfromDatamethod.static voidregister(Instantiator instantiator) Registers aDataSerializableclass with the data serialization framework.static voidregister(Instantiator instantiator, boolean distribute) Deprecated.voidsetContext(Object context) sets the context of thisInstantiator.voidsetEventId(Object eventId) sets the uniqueeventIdof thisInstantiator.
-
Constructor Details
-
Instantiator
Creates a newInstantiatorthat instantiates a given class.- Parameters:
c- TheDataSerializableclass to register. This class must have a static initializer that registers thisInstantiator.classId- A unique id for classc. TheclassIdmust not be zero. This has been anintsince dsPhase1.- Throws:
IllegalArgumentException- Ifcdoes not implementDataSerializable,classIdis less than or equal to zero.NullPointerException- Ifcisnull
-
-
Method Details
-
register
Registers aDataSerializableclass with the data serialization framework. This method is usually invoked from the static initializer of a class that implementsDataSerializable.- Parameters:
instantiator- AnInstantiatorwhosenewInstance()method is invoked when an object is data deserialized.- Throws:
IllegalStateException- If classcis already registered with a different class id, or another class has already been registered with idclassIdNullPointerException- Ifinstantiatorisnull.
-
register
Deprecated.as of 9.0 useregister(Instantiator)insteadRegisters aDataSerializableclass with the data serialization framework. This method is usually invoked from the static initializer of a class that implementsDataSerializable.- Parameters:
instantiator- AnInstantiatorwhosenewInstance()method is invoked when an object is data deserialized.distribute- True if the registeredInstantiatorhas to be distributed to other members of the distributed system. Note that if distribute is set to false it may still be distributed in some cases.- Throws:
IllegalArgumentException- If classcis already registered with a different class id, or another class has already been registered with idclassIdNullPointerException- Ifinstantiatorisnull.
-
newInstance
Creates a new "empty" instance of aDataSerializableclass whose state will be filled in by invoking itsfromDatamethod.- Returns:
- a new "empty" instance of a
DataSerializableclass - See Also:
-
getInstantiatedClass
Returns theDataSerializableclass that is instantiated by thisInstantiator.- Returns:
- the
DataSerializableclass that is instantiated by thisInstantiator
-
getId
public int getId()Returns the uniqueidof thisInstantiator.- Returns:
- the unique
idof thisInstantiator
-
setEventId
sets the uniqueeventIdof thisInstantiator. For internal use only.- Parameters:
eventId- the uniqueeventIdof thisInstantiator
-
getEventId
Returns the uniqueeventIdof thisInstantiator. For internal use only.- Returns:
- the unique
eventIdof thisInstantiator
-
setContext
sets the context of thisInstantiator. For internal use only.- Parameters:
context- the context of thisInstantiator
-
getContext
Returns the context of thisInstantiator. For internal use only.- Returns:
- the context of this
Instantiator
-
register(Instantiator)instead