gpt4 book ai didi

java - 在 Hazelcast 中使用 ArrayList 的派生作为值时需要自定义序列化程序

转载 作者:行者123 更新时间:2023-11-30 06:57:59 24 4
gpt4 key购买 nike

我有一个 IMAP,它的键是 String,值是 ArrayList 的派生词。我需要在此 map 的一个键上运行 EntryProcessor。另请注意,Employee 是一个实现了 Serializable 接口(interface)的 POJO。

当我执行下面给出的代码时,代码打印出“Why so !”我得到了 ClassCastException,其中提到 java.util.ArrayList 不能在 process() 中转换为 Employees ListValueEntryProcessor 的方法如下。

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

public class Employees extends ArrayList implements Serializable
{

private static final long serialVersionUID = 1L;

/**
Constructs a new employees object
*/
public Employees()
{
super();
}
}

HazelcastInstance hazelcastInstance = HazelcastHelper.getHazelcastInstance();
IMap<String, Employees> empMap = hazelcastInstance.getMap("employeesMap");

Employees empList = new Employees();
Employee employee = new Employee();
empList.add(employee);
empMap.put("companyId", employees);
empMap.executeOnKey("companyId", new IncSalaryEntryProcessor());

public static class ListValueEntryProcessor extends AbstractEntryProcessor<String, Employees>
{

private static final long serialVersionUID = 1L;

@Override
public Object process(Entry<String, Employees> arg0)
{
if(! (arg0.getValue() instanceof Employees))
{
System.out.println("Why so !");
}
// ClassCastException thrown here.
Employees empList = arg0.getValue();
return true;
}

}

最佳答案

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

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

关于java - 在 Hazelcast 中使用 ArrayList 的派生作为值时需要自定义序列化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33103491/

24 4 0