I am using Kryo Serialization for Hazelcast (3.5.4). Now I have the following object. public class XData extends HashMap {...} public class X { ..} Now, the XData will contain key as Integer and value as X object. I tried to have a KryoSerializer for XData:
public class XDataKryoSerializer<K, V> implements StreamSerializer<XData<K, V>>
{
private static final ThreadLocal<Kryo> kryoThreadLocal = new ThreadLocal<Kryo>()
{
@Override
protected Kryo initialValue()
{
Kryo kryo = new Kryo();
kryo.register(XData.class);
kryo.register(X.class);
return kryo;
}
};
@Override
public int getTypeId()
{
return KryoSerializationConstant.XDATA_TYPE;
}
@Override
public XData<K, V> read(ObjectDataInput inp) throws IOException
{
InputStream in = (InputStream) inp;
Input input = new Input(in);
Kryo kryo = kryoThreadLocal.get();
return kryo.readObject(input, XData.class);
}
@Override
public void write(ObjectDataOutput out, XData<K, V> xData) throws IOException
{
Kryo kryo = kryoThreadLocal.get();
Output output = new Output((OutputStream) out);
kryo.writeObject(output, xData);
output.flush();
}
@Override
public void destroy()
{
// TODO Auto-generated method stub
}
}
Here is the hazelcast.xml file:
<serialization>
<portable-version>0</portable-version>
<serializers>
<serializer type-class="com.abc.hazelcast.benchmarking.data.javaSer.X"
class-name="com.abc.hazelcast.benchmarking.data.kryoSer.XKryoSerializer" />
<serializer type-class="com.abc.hazelcast.benchmarking.data.javaSer.XData"
class-name="com.abc.hazelcast.benchmarking.data.kryoSer.XDataKryoSerializer" />
</serializers>
</serialization>
<services enable-defaults="true" />
I also have a XKryoSerializable class in the similar way. Things work fine with Hazelcast but the XKryoSerializer does not get called while a xdata object is put in hazelcast. Is this the expected behavior or am I missing something? Is there a way so that the kryo serializer for content object, X can also gets called while a xdata object's read/write method is called?