2016-01-15 1 views
1

Не могли бы вы сообщить мне, что я делаю неправильно здесь? Я действительно борюсь за внедрение более эффективного сериализатора для 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> 

Я все еще, кажется, что-то не хватает? Большое спасибо!

ответ

0

Вам необходимо написать специальный StreamSerializer для интерфейса Set. Всякий раз, когда Hazelcast начинает сериализовать класс Serializable, он теряет контроль сериализации. Есть несколько обходных решений, но все они не очень приятные. Лучший способ для перехвата сериализация Set с помощью Сериализуемой и предлагает пользовательский сериалайзер: http://docs.hazelcast.org/docs/3.5/manual/html-single/index.html#streamserializer

Вы найдете пример для типа LinkedList внутри основного кода Hazelcast: https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java/com/hazelcast/internal/serialization/impl/LinkedListStreamSerializer.java