Исключение перечисления 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.

Другие вопросы по тегам