I've run into the following issue in Hazelcast 3.1: I have a cluster and a client node. On a client node I try to register the entry listener for the IMap:
map.addEntryListener(new ListenerAdapter<>(listener), new PredicateAdapter<>(predicate), true);
Both ListenerAdapter and PredicateAdapter are Java Serializables as well as all their fields. But I get the following from Hazelcast:
com.hazelcast.nio.serialization.HazelcastSerializationException: java.lang.ClassCastException: ....PredicateAdapter cannot be cast to com.hazelcast.nio.serialization.Portable
at com.hazelcast.nio.serialization.SerializationServiceImpl.handleException(SerializationServiceImpl.java:290)
at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:192)
at com.hazelcast.nio.serialization.SerializationServiceImpl.toData(SerializationServiceImpl.java:155)
at com.hazelcast.client.spi.impl.ClientClusterServiceImpl._sendAndHandle(ClientClusterServiceImpl.java:270)
at com.hazelcast.client.spi.impl.ClientClusterServiceImpl.sendAndHandle(ClientClusterServiceImpl.java:257)
at com.hazelcast.client.spi.impl.ClientInvocationServiceImpl.invokeOnRandomTarget(ClientInvocationServiceImpl.java:60)
at com.hazelcast.client.spi.ListenerSupport$1.run(ListenerSupport.java:60)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
at com.hazelcast.util.executor.PoolExecutorThreadFactory$ManagedThread.run(PoolExecutorThreadFactory.java:59)
Caused by: java.lang.ClassCastException: ....PredicateAdapter cannot be cast to com.hazelcast.nio.serialization.Portable
at com.hazelcast.map.client.MapAddEntryListenerRequest.writePortable(MapAddEntryListenerRequest.java:139)
at com.hazelcast.nio.serialization.PortableSerializer.write(PortableSerializer.java:57)
at com.hazelcast.nio.serialization.PortableSerializer.write(PortableSerializer.java:29)
at com.hazelcast.nio.serialization.StreamSerializerAdapter.write(StreamSerializerAdapter.java:48)
The reason seems to be in com.hazelcast.nio.serialization.SerializationServiceImpl.toData - it registers a portableSerializerAdapter for any instance of Portable, and MapAddEntryListenerRequest requires Predicate to be Portable (see MapAddEntryListenerRequest.writePortable). This is a very limiting restriction provided I'm not going to use Hazelcast's Portable serialization and not going to tie my predicate implementation to any of Hazelcast-specific interfaces.