我正在使用带有透明激活/持久性的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())当然会解决问题。 我认为应该支持标准集合框架。
答案 0 :(得分:1)
我甚至会小心使用db4o中的枚举。 db4o存储枚举的方式非常危险。如果你重构,更改枚举,它可能会导致超级奇怪的行为,当你在db4o中存储枚举时的错误。到目前为止,枚举上的switch语句可能会跳到错误的位置。
简短的理由:db4o将枚举存储为对象实例,并在加载时设置每次反射的枚举值,这可能会导致非常奇怪的错误,因为枚举不应该更改。
我会避免存储(Java)-enums,因此也避免使用枚举集。