As an alternative to the existing serialization methods, Hazelcast offers a Portable serialization that have the following advantages
In order to support these features, a serialized Portable object contains meta information like the version and the concrete location of the each field in the binary data. This way Hazelcast is able to navigate in the byte[] and de-serialize only the required field without actually de-serializing the whole object which improves the Query performance.
With multiversion support, you can have two nodes where each of them having different versions of the same Object and Hazelcast will store both meta information and use the correct one to serialize and de-serialize Portable objects depending on the node. This is very helpfull when you are doing a rolling upgrade without shutting down the cluster.
Also note that Portable serialization is totally language independent and is used as the binary protocol between Hazelcast server and clients.
A sample Portable implementation of a Foo class will look like the following.
public class Foo implements Portable{ final static int ID = 5; private String foo; public String getFoo() { return foo; } public void setFoo(String foo) { this.foo = foo; } @Override public int getFactoryId() { return 1; } @Override public int getClassId() { return ID; } @Override public void writePortable(PortableWriter writer) throws IOException { writer.writeUTF("foo", foo); } @Override public void readPortable(PortableReader reader) throws IOException { foo = reader.readUTF("foo"); } }
Similar to
IdentifiedDataSerializable
,
a Portable Class must provide
classId
andfactoryId
. The Factory object will be used to create
the Portable object given the classId
.
A sample
Factory
could be implemented as following:
public class MyPortableFactory implements PortableFactory {
@Override
public Portable create(int classId) {
if (Foo.ID == classId)
return new Foo();
else return null;
}
}
The last step is to register the
Factory
to the SerializationConfig
.
Programmatic Configuration
Config config = new Config();
config.getSerializationConfig().addPortableFactory(1, new MyPortableFactory());
XML Configuration
<hazelcast>
<serialization>
<portable-version>0</portable-version>
<portable-factories>
<portable-factory factory-id="1">com.hazelcast.nio.serialization.MyPortableFactory</portable-factory>
</portable-factories>
</serialization>
</hazelcast>
Note that the id
that is passed to the
SerializationConfig
is same as the
factoryId
that
Foo
class returns.
TODO: ClassDefinitionBuilder...