Не могли бы вы сообщить мне, что я делаю неправильно здесь? Я действительно борюсь за внедрение более эффективного сериализатора для Hazelcast. У меня есть следующие Java-класс:Как я могу сериализовать класс Java через Hazelcast DataSerializable, когда он содержит общие типы?
public class Tuple<X, Y> implements DataSerializable
{
public X x;
public Y y;
private Tuple()
{
}
public Tuple(X x, Y y)
{
this.x = x;
this.y = y;
}
@Override
public void readData(ObjectDataInput in)
throws IOException {
Instance.log("read data");
this.x = (X)in.readObject();
this.y = (Y)in.readObject();
}
@Override
public void writeData(ObjectDataOutput out)
throws IOException {
Instance.log("write data");
out.writeObject(this.x);
out.writeObject(this.y);
}
}
, и я использую его следующим образом:
HazelcastInstance hazelcast = Hazelcast.newHazelcastInstance();
IMap<String, Set<Tuple<Integer, Double>>> myMap = Hazelcast.getMap("myMap");
однако, всякий раз, когда я пытаюсь использовать эту карту (за исключением реализации Serializable, что сценарий работает отлично) Я возвращаю это исключение:
com.hazelcast.nio.serialization.HazelcastSerializationException: java.io.NotSerializableException: Tuple
Что я здесь делаю неправильно? Цените любую идею, спасибо миллион!
Update
Попробовав предложению (спасибо noctarius) теперь у меня есть это:
public class TupleSetStreamSerializer
implements StreamSerializer<Set<Tuple>> {
@Override
public int getTypeId() {
return SerializationIdentifiers.TupleSerializationFactoryId;
}
@Override
public void write(ObjectDataOutput out, final Set<Tuple> set)
throws IOException {
int size = set == null ? 0 : set.size();
Instance.log("Serialize set");
out.writeInt(size);
if (size>0) {
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
out.writeObject(iterator.next());
}
}
}
@Override
public Set<Tuple> read(ObjectDataInput in)
throws IOException {
Instance.log("Deserialize set");
int size = in.readInt();
Set result = null;
if (size > 0) {
result = new HashSet<Tuple>();
for (int i = 0; i < size; i++) {
result.add(in.readObject());
}
}
return result;
}
@Override
public void destroy() {
}
}
и это также
public class TupleStreamSerializer
implements StreamSerializer<Tuple> {
@Override
public int getTypeId() {
return SerializationIdentifiers.TupleSerializationFactoryId;
}
@Override
public void write(ObjectDataOutput out, Tuple tup)
throws IOException {
out.writeObject(tup.x);
out.writeObject(tup.y);
}
@Override
public Tuple read(ObjectDataInput in)
throws IOException {
Object x = in.readObject();
Object y = in.readObject();
return new Tuple(x,y);
}
@Override
public void destroy() {
}
}
с конфигурацией, как это (попытка комментирования различных варианты и все)
<hazelcast>
<serialization>
<serializers>
<serializer type-class="Tuple">TupleStreamSerializer</serializer>
<serializer type-class="Set<Tuple>">TupleSetStreamSerializer</serializer>
</serializers>
</serialization>
</hazelcast>
Я все еще, кажется, что-то не хватает? Большое спасибо!