2016-04-01 12 views
2

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つのノード/メンバを実行しています。

答えて

2

クエリでは、属性にアクセスしてクエリを実行するために、バイトストリームを逆シリアル化する必要があるため、ノードについてクラスを知る必要があります。つまり、オブジェクトに対してクエリを実行する場合は、モデルクラス(およびシリアライザ)をサーバー側に配置する必要があります。

キーベースのアクセスを使用する場合、キーのバイト配列を比較するときに値を調べる必要はなく、結果を送信するだけです。その方法では、モデルクラスもシリアライザもHazelcastノードで使用できなくてはなりません。

私はそれが理にかなっていると思います。

+1

サーバー/インスタンスの設定をプログラムで設定する方法はありますか? –

+0

Config config = new XmlConfigBuilder()。ビルド(); SerializationConfig serializationConfig = config.getSerializationConfig(); serializationConfig.add ...(); これは何ですか? – noctarius

関連する問題