db4o enumset异常

时间:2012-12-24 04:48:52

标签: exception db4o object-oriented-database enumset oodb

我正在使用带有透明激活/持久性的db4o 8.0 ... 我有一个包含EnumSet(和其他东西)的类。我实例化,在set和store中添加一个枚举值。当我在DB中搜索时,获取它并尝试激活该对象我得到了这个例外:

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,SO社区似乎并不十分活跃。这是因为db4o不是很受欢迎,还是有另一个“支持”的地方?

编辑2:
我在versant的论坛上发现这个帖子可能是相关的,但没有帮助: http://community.versant.com/Forums/tabid/98/aft/1046/Default.aspx#3370

  

我认识到了另一件事。没有内置的java.util.EnumMap和java.util.EnumSet支持,db4o会抛出一个   异常,因为没有默认构造函数,并且所有具有null args的构造函数都将失败。   Db4o.configure()。objectClass(“java.util.EnumMap”)。translate(new com.db4o.config.TSerializable())当然会解决问题。   我认为应该支持标准集合框架。

1 个答案:

答案 0 :(得分:1)

我甚至会小心使用db4o中的枚举。 db4o存储枚举的方式非常危险。如果你重构,更改枚举,它可能会导致超级奇怪的行为,当你在db4o中存储枚举时的错误。到目前为止,枚举上的switch语句可能会跳到错误的位置。

简短的理由:db4o将枚举存储为对象实例,并在加载时设置每次反射的枚举值,这可能会导致非常奇怪的错误,因为枚举不应该更改。

我会避免存储(Java)-enums,因此也避免使用枚举集。