我有一个IMAP,其密钥是String
,值是ArrayList
的衍生产品。我需要在此地图的某个键上运行EntryProcessor
。另请注意,Employee
是一个实现Serializable
接口的POJO。
当我执行下面给出的代码时,代码打印出“为什么这样!”我得到ClassCastException
,其中提到java.util.ArrayList
无法在下面Employees
的{{1}}方法中投放到process()
。
Q1。我了解到我需要为我的类型(ListValueEntryProcessor
)添加自定义序列化程序,以便它可以序列化为Employees
对象而不是Employees
对象。我想知道为什么必须为内置类型添加“自定义序列化程序”,例如ArrayList
,其项目也标记为ArrayList
?
Serializable
答案 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());
}
}
}
}