Hazelcast 3.6.1" нет подходящего де-сериализатора для исключения типа"


Я использую Hazelcast 3.6.1 для чтения с карты. Класс объектов, сохраненный на карте, называетсяSchedule .

Я настроил пользовательский сериализатор на стороне клиента, как это.

ClientConfig config = new ClientConfig();
SerializationConfig sc = config.getSerializationConfig();
sc.addSerializerConfig(add(new ScheduleSerializer(), Schedule.class));
...
private SerializerConfig add(Serializer serializer, Class<? extends Serializable> clazz) {
    SerializerConfig sc = new SerializerConfig();
    sc.setImplementation(serializer).setTypeClass(clazz);
    return sc;
}

Карта создается следующим образом

private final IMap<String, Schedule> map = client.getMap("schedule");

Если я получаю от карты, используя идентификатор расписания в качестве ключа, карта возвращает правильно значение, например

return map.get("zx81");

Если я попытаюсь использовать предикат SQL, например

return new ArrayList<>(map.values(new SqlPredicate("statusActive")));

Тогда я получаю следующее ошибка

Exception in thread "main" com.hazelcast.nio.serialization.HazelcastSerializationException: There is no suitable de-serializer for type 2. This exception is likely to be caused by differences in the serialization configuration between members or between clients and members.

Пользовательский сериализатор использует Kryo для сериализации (на основе этого блога http://blog.hazelcast.com/comparing-serialization-methods/)

public class ScheduleSerializer extends CommonSerializer<Schedule> {

    @Override
    public int getTypeId() {
        return 2;
    }

    @Override
    protected Class<Schedule> getClassToSerialize() {
        return Schedule.class;
    }

}

CommonSerializer определяется как

public abstract class CommonSerializer<T> implements StreamSerializer<T> {

    protected abstract Class<T> getClassToSerialize();

    @Override
    public void write(ObjectDataOutput objectDataOutput, T object) {
        Output output = new Output((OutputStream) objectDataOutput);
        Kryo kryo = KryoInstances.get();
        kryo.writeObject(output, object);
        output.flush(); // do not close!
        KryoInstances.release(kryo);
    }

    @Override
    public T read(ObjectDataInput objectDataInput) {
        Input input = new Input((InputStream) objectDataInput);
        Kryo kryo = KryoInstances.get();
        T result = kryo.readObject(input, getClassToSerialize());
        input.close();
        KryoInstances.release(kryo);
        return result;
    }

    @Override
    public void destroy() {
        // empty
    }
}

Нужно ли выполнять какие-либо настройки на стороне сервера ? Я думал, что конфигурации клиента будет достаточно.

Я использую клиент Hazelcast 3.6.1 и у меня работает один узел/член.

1 2

1 ответ:

Запросы

Требуют, чтобы узлы знали о классах, поскольку байт-поток должен быть десериализован для доступа к атрибутам и запроса к ним. Это означает, что при запросе объектов необходимо также развернуть классы моделей (и сериализаторы) на стороне сервера.

В то время как при использовании доступа на основе ключей нам не нужно заглядывать в значения (ни в ключи, поскольку мы сравниваем байтовые массивы ключа) и просто отправлять результат. Таким образом, ни классы моделей, ни сериализаторы должны быть доступны на узлах Hazelcast.

Я надеюсь, что это имеет смысл.