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
be Serializable
.
Hazelcast serializes all your objects into an instance
of com.hazelcast.nio.Data
. Data
is the binary
representation of an object and it holds list of java.nio.ByteBuffer
instances
which are reused. When Hazelcast serializes an object into Data
,
it first checks whether the object is an instance of well-known, optimizable object
such as String, Long, Integer, byte[], ByteBuffer, Date
. If not, it then checks
whether the object is an instance
of com.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
is DataSerializable
, 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 brake the serialization. For Example: Putting
Hazelcast.getMap("anyMap").put("key", "dummy value");
line in readData or writeData methods will breake 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.