Исключение перечисления db4o
Я использую db4o 8.0 с прозрачной активацией / постоянством... У меня есть класс, который содержит EnumSet (и другие вещи). Я создаю экземпляр, добавляю значение enum в set и store. Когда я ищу в БД, получаю его и пытаюсь активировать объект, я получаю следующее исключение:
Exception in thread "main" java.lang.ClassCastException: class Resources.Enums$fooEnum_t != null
at java.util.EnumSet.typeCheck(EnumSet.java:380)
at java.util.RegularEnumSet.add(RegularEnumSet.java:160)
at java.util.RegularEnumSet.add(RegularEnumSet.java:36)
at com.db4o.typehandlers.CollectionTypeHandler.addToCollection(CollectionTypeHandler.java:120)
at com.db4o.typehandlers.CollectionTypeHandler.activate(CollectionTypeHandler.java:45)
at com.db4o.internal.Handlers4.activate(Handlers4.java:300)
...
...
Для хранения enumSet в db4o я использую:
config.common().objectClass(EnumSet.class).translate(new com.db4o.config.TSerializable());
Я не могу понять, в чем проблема. Есть идеи?
РЕДАКТИРОВАТЬ:
Я не знаю, где задать вопросы о db4o. Так что сообщество не очень активно занимается db4o. Это потому, что db4o не очень популярен или есть другое место для "поддержки"?
РЕДАКТИРОВАТЬ 2:
Я нашел этот пост на форуме Версанта, который может быть актуален, но не помогает: http://community.versant.com/Forums/tabid/98/aft/1046/Default.aspx
Я узнал еще одну вещь. Нет встроенной поддержки для java.util.EnumMap и java.util.EnumSet, db4o сгенерирует исключение, потому что нет конструктора по умолчанию, и все конструкторы с нулевыми аргументами завершатся с ошибкой для этих классов. Db4o.configure(). ObjectClass("java.util.EnumMap"). Translate(new com.db4o.config.TSerializable()), конечно, решит проблему. Я думаю, что стандартная структура коллекции должна поддерживаться.
1 ответ
Я даже был бы осторожен с использованием перечислений в db4o. Способ, которым db4o хранит enum, чрезвычайно опасен. Если вы выполните рефакторинг, измените enum, это может привести к очень странному поведению, ошибкам при сохранении этого enum в db4o. Это заходит так далеко, что операторы switch в перечислениях могут перейти в неправильное место.
Краткая причина: db4o хранит перечисления как экземпляр объекта и устанавливает значения перечисления для каждого отражения при загрузке, это может привести к очень странным ошибкам, поскольку перечисление не должно изменяться.
Я бы не стал хранить (Java)-enum, а следовательно, и enum-set.