1

我正在使用具有透明激活/持久性的 db4o 8.0 ......我有一个包含 EnumSet (和其他东西)的类。我实例化,将枚举值添加到集合和存储中。当我在 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 的问题。SO 社区似乎对 db4o 不太活跃。这是因为 db4o 不是很受欢迎还是有其他地方可以“支持”?

编辑 2:
我在 versant 的论坛上发现该帖子可能相关但无济于事:http: //community.versant.com/Forums/tabid/98/aft/1046/Default.aspx#3370

我又认出了一件事。没有对 java.util.EnumMap 和 java.util.EnumSet 的内置支持,db4o 将抛出异常,因为没有默认构造函数,并且所有带空参数的构造函数对于这些类都将失败。Db4o.configure().objectClass("java.util.EnumMap").translate(new com.db4o.config.TSerializable()) 当然会解决这个问题。我认为应该支持标准的集合框架。

4

1 回答 1

1

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

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

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

于 2012-12-24T10:25:29.787 回答