【问题标题】:db4o enumset exceptiondb4o 枚举集异常
【发布时间】:2012-12-24 04:48:52
【问题描述】:

我正在使用具有透明激活/持久性的 db4o 8.0 ... 我有一个包含 EnumSet (和其他东西)的类。我实例化,将枚举值添加到集合和存储中。当我在数据库中搜索时,获取它并尝试激活我得到这个异常的对象:

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()) 当然会解决这个问题。 我觉得应该支持标准的集合框架。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复!我想我这里有一种情况......我的项目充满了枚举,很难改变它,或者处理没有枚举的事情。我应该在这里找到一些技巧。我可以使用某种翻译器并将枚举保存为字符串吗?
    • 在关于 db4o 的教程和搜索上投入了足够的时间后,我感觉有很多错误和糟糕的设计。我什至不确定项目有多活跃。有时我想我应该开始寻找更好的东西,但我不知道是否有任何好的选择。 Sql 解决方案是低级的,并且定义非常严格,oodbs 不是那么流行和发达......数据库是如此混乱:p
    • 您最终找到了使用 db4o 的解决方案吗?因为我也有同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-10
    • 2015-09-23
    相关资源
    最近更新 更多