需要自定义序列化器,同时使用ArrayList的衍生物作为Hazelcast中的值

时间:2015-10-13 13:05:22

标签: java hazelcast distributed-caching distributed-cache hazelcast-imap

我有一个IMAP,其密钥是String,值是ArrayList的衍生产品。我需要在此地图的某个键上运行EntryProcessor。另请注意,Employee是一个实现Serializable接口的POJO。

当我执行下面给出的代码时,代码打印出“为什么这样!”我得到ClassCastException,其中提到java.util.ArrayList无法在下面Employees的{​​{1}}方法中投放到process()

Q1。我了解到我需要为我的类型(ListValueEntryProcessor)添加自定义序列化程序,以便它可以序列化为Employees对象而不是Employees对象。我想知道为什么必须为内置类型添加“自定义序列化程序”,例如ArrayList,其项目也标记为ArrayList

Serializable

1 个答案:

答案 0 :(得分:4)

这是我们方面的一个错误。我创建了一个bug报告:

https://github.com/hazelcast/hazelcast/issues/6455

以下代码应暂时解决您的问题:

public class Main  {

public static void main(String[] args){
    HazelcastInstance hz = Hazelcast.newHazelcastInstance();
    IMap<String,Employees> map = hz.getMap("foo");
    map.put("1", new Employees());

    Employees employees = map.get("1");
    System.out.println(employees);
}

static class Employees extends ArrayList implements DataSerializable {
    @Override
    public void writeData(ObjectDataOutput out) throws IOException {
        out.writeInt(size());
        for(Object item: this){
            out.writeObject(item);
        }
    }

    @Override
    public void readData(ObjectDataInput in) throws IOException {
        int size = in.readInt();
        for(int k=0;k<size;k++){
            add(in.readObject());
        }
    }
}

}