Table of Contents
All your distributed objects such as your key and value objects, objects you offer into
distributed queue and your distributed callable/runnable objects have to
beSerializable
.
Hazelcast serializes all your objects into an instance
ofcom.hazelcast.nio.Data
.
Data
is the binary
representation of an object. When Hazelcast serializes an object intoData
,
it first checks whether the object is an instance of well-known, optimizable object
such asString, Long, Integer, byte[], ByteBuffer, Date
. If not, it then checks
whether the object is an instance
ofcom.hazelcast.nio.DataSerializable
. If not, Hazelcast
uses standard java serialization to convert the object into binary format. See
com.hazelcast.nio.Serializer
for details.
So for faster serialization, Hazelcast recommends to use of
String, Long,
Integer, byte[]
objects or to implement
com.hazelcast.nio.DataSerializable
interface. Here is an
example of a class implementing
com.hazelcast.nio.DataSerializable
interface.
public class Address implements com.hazelcast.nio.DataSerializable { private String street; private int zipCode; private String city; private String state; public Address() {} //getters setters.. public void writeData(DataOutput out) throws IOException { out.writeUTF(street); out.writeInt(zipCode); out.writeUTF(city); out.writeUTF(state); } public void readData (DataInput in) throws IOException { street = in.readUTF(); zipCode = in.readInt(); city = in.readUTF(); state = in.readUTF(); } }
Lets take a look at another example which is encapsulating a
DataSerializable
field.
public class Employee implements com.hazelcast.nio.DataSerializable { private String firstName; private String lastName; private int age; private double salary; private Address address; //address itself is DataSerializable public Employee() {} //getters setters.. public void writeData(DataOutput out) throws IOException { out.writeUTF(firstName); out.writeUTF(lastName); out.writeInt(age); out.writeDouble (salary); address.writeData (out); } public void readData (DataInput in) throws IOException { firstName = in.readUTF(); lastName = in.readUTF(); age = in.readInt(); salary = in.readDouble(); address = new Address(); // since Address is DataSerializable let it read its own internal state address.readData (in); } }
As you can see, since
address
field itself
isDataSerializable
, it is calling
address.writeData(out)
when writing and
address.readData(in)
when reading.
Caution: Hazelcast serialization is done on the user thread and it assumes that there will be only one object serialization at a time. So putting any Hazelcast operation that will require to serialize anything else will break the serialization. For Example: Putting
Hazelcast.getMap("anyMap").put("key", "dummy value");
line in readData or writeData methods will break the serialization. If you have to perform such an operation, at least it should be performed in another thread which will force the serialization to take on different thread.