当Java类包含泛型类型时,如何通过Hazelcast DataSerializable序列化它?

当Java类包含泛型类型时,如何通过Hazelcast DataSerializable序列化它?,java,generics,serialization,hazelcast,Java,Generics,Serialization,Hazelcast,你能告诉我我做错了什么吗?我正在努力为Hazelcast实现一个更高效的序列化程序。我有以下Java类: 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

你能告诉我我做错了什么吗?我正在努力为Hazelcast实现一个更高效的序列化程序。我有以下Java类:

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

}   
我做错了什么?感谢你的任何想法,万分感谢

更新

在尝试了这个建议之后(谢谢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 () {
    }
}
公共类TupleSetStreamSerializer
实现StreamSerializer{
@凌驾
public int getTypeId(){
返回SerializationIdentifiers.TupleSerializationFactoryId;
}
@凌驾
公共无效写入(ObjectDataOutput输出,最终设置)
抛出IOException{
int size=set==null?0:set.size();
log(“序列化集”);
out.writeInt(大小);
如果(大小>0){
迭代器迭代器=set.Iterator();
while(iterator.hasNext()){
writeObject(iterator.next());
}
}
}
@凌驾
公共集读取(ObjectDataInput-in)
抛出IOException{
log(“反序列化集”);
int size=in.readInt();
设置结果=null;
如果(大小>0){
结果=新的HashSet();
对于(int i=0;i
这也

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 () {
    }
}
公共类TupleStreamSerializer
实现StreamSerializer{
@凌驾
public int getTypeId(){
返回SerializationIdentifiers.TupleSerializationFactoryId;
}
@凌驾
public void write(ObjectDataOutput out,Tuple-tup)
抛出IOException{
out.writeObject(tup.x);
out.writeObject(tup.y);
}
@凌驾
公共元组读取(ObjectDataInput-in)
抛出IOException{
对象x=in.readObject();
对象y=in.readObject();
返回新的元组(x,y);
}
@凌驾
公共空间销毁(){
}
}
使用这样的配置(尝试注释各种变体和所有变体)


元组流序列化程序
TupleSetStreamSerializer

我好像还是错过了什么?非常感谢

您必须为Set接口编写一个特殊的StreamSerializer。每当Hazelcast开始序列化一个可序列化的标记类时,它就会失去序列化控制。有一些变通办法,但都不是很好。最好的方法是使用Serializable拦截集合的序列化,并提供自定义序列化程序:

您将在Hazelcast核心代码中找到LinkedList类型的示例:

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>