Hazelcast 3.6.1を使用してマップから読み込みます。マップに格納されるオブジェクトクラスは、スケジュールと呼ばれます。Hazelcast 3.6.1「タイプに適したデシリアライザがありません」
私はこのようにクライアント側でカスタムシリアライザを設定しました。私はキーとしてスケジュールIDを使用して、マップから取得する場合
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.
カスタム・シリアライザがCommonSerializerが
として定義されてpublic class ScheduleSerializer extends CommonSerializer<Schedule> {
@Override
public int getTypeId() {
return 2;
}
@Override
protected Class<Schedule> getClassToSerialize() {
return Schedule.class;
}
}
(このブログhttp://blog.hazelcast.com/comparing-serialization-methods/に基づいて)シリアル化するためにKryoを使用して取得
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つのノード/メンバを実行しています。
サーバー/インスタンスの設定をプログラムで設定する方法はありますか? –
Config config = new XmlConfigBuilder()。ビルド(); SerializationConfig serializationConfig = config.getSerializationConfig(); serializationConfig.add ...(); これは何ですか? – noctarius