我使用的是具有透明激活/持久性的db4o 8.0。我有一个包含EnumSet (和其他东西)的类。我实例化,在set和存储中添加一个枚举值。当我在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并不十分活跃。这是因为db4o不是很受欢迎,还是有另一个“支持”的地方?
编辑2:
我发现在versant的论坛上发布的帖子可能是相关的,但没有帮助:http://community.versant.com/Forums/tabid/98/aft/1046/Default.aspx#3370
我还认出了一件事。不支持java.util.EnumMap和java.util.EnumSet,db4o将抛出一个异常,因为没有默认构造函数,所有具有空args的构造函数都会为这些类失败。当然,Db4o.configure().objectClass("java.util.EnumMap").translate(new com.db4o.config.TSerializable()将解决这个问题。我认为应该支持标准的集合框架。
发布于 2012-12-24 10:25:29
我甚至会小心在db4o中使用枚举。db4o存储枚举的方式是极其危险的。如果您重构,更改枚举,它可能会导致超级奇怪的行为,错误,当您将枚举存储在db4o中。到目前为止,枚举上的开关语句可能跳到错误的位置。
简短的理由: db4o像存储对象实例一样存储枚举,并在加载时为每个反射设置枚举值,这可能会导致非常奇怪的错误,因为枚举不应该更改。
我将避免存储(Java)-enums,因此也避免使用枚举集。
https://stackoverflow.com/questions/14017198
复制相似问题