具有使用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时)。


是否可以为JVM 8修复它(是的,我知道db4o已死)?
使用什么代替db4o来进行JVM版本无关的序列化/反序列化?

最佳答案

快速回答:
符合db4o IS的Java8。这是休眠代理问题(Javassist和动态类):(

更新07/20/15:不确定db4o是否100%在JVM 8下正确运行。我们有一个奇怪的测试用例,无法解释(请参阅下文)。同时,本机Java序列化可以正常工作(但db4o不能)。

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

15年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++;
    }
}

关于java - db4o Java 8兼容吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31427859/

10-09 18:56