db4o Java 8 兼容吗?

Is db4o Java 8 compatible?

有使用 db4o 的副项目。它不适用于 JVM 8(反序列化得到 Caused by: java.lang.IllegalArgumentException: Can not set java.lang.Long field com.xxx.yyy.version to com.db4o.reflect.generic.GenericObject)。

  1. 是否可以为 JVM 8 修复它(是的,我知道 db4o 已死)?
  2. 对于独立于 JVM 版本的 JVM,使用什么代替 db4o serialisation/de-serialization?

快速回答: Db4o IS 兼容 Java 8. 这是休眠代理问题(Javassist 和动态 类):(

2015 年 7 月 20 日更新: 不确定 db4o 在 JVM 8 下是否 100% 正确工作。我们有一个我们无法解释的奇怪测试用例(见下文)。同时本机 Java 序列化工作正常(但 db4o 没有)。

完整答案: 如果有人需要详细信息,这个问题出现在 Hibernate 4.3 中(在以前的版本中一切都按预期工作)。不幸的是,我没有找到正确的解决方案。快速而肮脏的解决方法是在导出到 db4o 时跳过问题字段(通过 transient 关键字)。

2015 年 7 月 30 日更新: 已找到解决方案(问题出现在 Javassist 1.8 中):

ProxyFactory.nameGenerator = new JavassitBackwardCompatibleNamingGenerator();

public class JavassitBackwardCompatibleNamingGenerator implements UniqueName{
    private static int counter = 0;
    @Override
    public String get(String classname) {
        return classname + "_$$_javassist_" + counter++;
    }
}