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
)。
- 是否可以为 JVM 8 修复它(是的,我知道 db4o 已死)?
- 对于独立于 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++;
}
}
有使用 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 已死)?
- 对于独立于 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++;
}
}