Serialization Hazelcast 3.6.1“;“类型”没有合适的反序列化程序;例外

Serialization Hazelcast 3.6.1“;“类型”没有合适的反序列化程序;例外,serialization,client,hazelcast,kryo,Serialization,Client,Hazelcast,Kryo,我正在使用Hazelcast 3.6.1阅读地图。存储在地图中的对象类称为计划 我在客户端配置了一个自定义序列化程序,如下所示 ClientConfig config = new ClientConfig(); SerializationConfig sc = config.getSerializationConfig(); sc.addSerializerConfig(add(new ScheduleSerializer(), Schedule.class)); ... private Ser

我正在使用Hazelcast 3.6.1阅读地图。存储在地图中的对象类称为计划

我在客户端配置了一个自定义序列化程序,如下所示

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;
}
如果我尝试使用SQL谓词,例如

return new ArrayList<>(map.values(new SqlPredicate("statusActive")));
自定义序列化程序正在使用Kryo进行序列化(基于此博客)

公共类ScheduleSerializer扩展了CommonSerializer{
@凌驾
public int getTypeId(){
返回2;
}
@凌驾
受保护类getClassToSerialize(){
返回时间表.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
    }
}
公共抽象类CommonSerializer实现StreamSerializer{
受保护的抽象类getClassToSerialize();
@凌驾
公共无效写入(ObjectDataOutput ObjectDataOutput,T对象){
输出=新输出((OutputStream)objectDataOutput);
Kryo Kryo=KryoInstances.get();
writeObject(输出,对象);
output.flush();//不要关闭!
释放(kryo);
}
@凌驾
公共T读取(ObjectDataInput ObjectDataInput){
输入=新输入((InputStream)objectDataInput);
Kryo Kryo=KryoInstances.get();
T result=kryo.readObject(输入,getClassToSerialize());
input.close();
释放(kryo);
返回结果;
}
@凌驾
公共空间销毁(){
//空的
}
}
我需要在服务器端进行任何配置吗?我认为客户端配置就足够了


我使用的是Hazelcast client 3.6.1,有一个节点/成员正在运行。

查询要求节点了解类,因为ByTestStream必须反序列化才能访问属性并查询它们。这意味着,当您想要查询对象时,还必须在服务器端部署模型类(和序列化程序)

然而,当您使用基于键的访问时,我们不需要查看值(在比较键的字节数组时也不需要查看键),只需发送结果。这样,模型类和序列化程序都不必在Hazelcast节点上可用


我希望这是有道理的

那么,有没有一种方法可以通过编程在服务器/实例上设置配置呢;SerializationConfig SerializationConfig=config.getSerializationConfig();serializationConfig.add…();诸如此类?我在使用hazelcastInstance.getReplicatedMap(“fooo”)时遇到了这个错误,当我使用hazelcastInstance.getMap(“fooo”)时,它消失了
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.
public class ScheduleSerializer extends CommonSerializer<Schedule> {

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

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

}
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
    }
}