2

У меня есть IMAP, ключ которого равен String, а значение является производным от ArrayList. Мне нужно запустить EntryProcessor на ключ от этой карты. Также обратите внимание, что Employee является POJO, который реализует интерфейс Serializable.Необходимость создания пользовательских сериализаторов при использовании производных от ArrayList как значения в Hazelcast

Когда я выполнил приведенный ниже код, код печатает «Почему так!». и я получил ClassCastException, в котором упоминалось, что java.util.ArrayList не может быть отлит до Employees в способе process()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; 
    } 

} 
+0

да, я уверен, что я использовал 'Java. util.ArrayList'. Существует связанный с этим вопрос, который подтверждает мое понимание. http://stackoverflow.com/questions/31537670/get-returns-a-value-of-the-superclass-arraylist-in-hazelcast-3-5 – Dinesh

+0

можете ли вы отправить трассировку стека? – Sam

+0

@Sam, Исключение происходит в строке 'Сотрудники empList = arg0.getValue();'. Это известный случай с ЛПЭ, см. Ссылку SO, опубликованную выше. – Dinesh

ответ

4

Это ошибка на нашей стороне. Я создал отчет об ошибке:

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

}

+0

благодарит за понимание. Я использовал класс оболочки для обертывания объектов, которые мне нужно поместить в IMaps (как значения), используемые в моем продукте. Из-за устаревшего кода я не могу ввести зависимость от DataSerializable в данный момент. Однако вы предлагаете отличные результаты. ! Спасибо. – Dinesh