Необходимость в пользовательских сериализаторах при использовании производных ArrayList в качестве значения в Hazelcast

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

Когда я выполнил код, приведенный ниже, код печатает «Почему так!» и я получил 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;
    }

}

person Dinesh    schedule 13.10.2015    source источник
comment
да, я уверен, что использовал java.util.ArrayList. Есть связанный вопрос, который подтверждает мое понимание. stackoverflow.com/questions/31537670/   -  person Dinesh    schedule 13.10.2015
comment
Вы можете опубликовать трассировку стека?   -  person Hamid    schedule 13.10.2015
comment
@Sam, исключение происходит в строке Employees empList = arg0.getValue();. Это известный случай с hazelcast, см. ссылку SO, которую я разместил выше.   -  person Dinesh    schedule 13.10.2015
comment
печатает ли код Почему так?   -  person Hamid    schedule 13.10.2015
comment
@ Сэм, да. оно делает. Чтобы добавить, arg0.getValue() instanceof ArrayList оценивается как true   -  person Dinesh    schedule 13.10.2015
comment
Я предполагаю, что существует проблема сериализации, когда при десериализации вместо возврата Empoyees возвращается ArrayList. Позвольте мне создать для него тест и посмотреть, что произойдет.   -  person pveentjer    schedule 14.10.2015


Ответы (1)


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

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

}

person pveentjer    schedule 14.10.2015
comment
большое спасибо за признание проблемы. Я использовал класс-оболочку, чтобы обернуть объекты, которые мне нужно поместить в IMap (как значения), используемые в моем продукте. Из-за устаревшего кода в данный момент я не могу ввести зависимость от DataSerializable. Однако ваше предложение превосходно. ! Спасибо. - person Dinesh; 14.10.2015