【问题标题】:Is db4o Java 8 compatible?db4o Java 8 兼容吗?
【发布时间】:2015-07-15 10:27:19
【问题描述】:
有正在使用 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 版本无关的序列化/反序列化?
【问题讨论】:
标签:
java
serialization
java-8
deserialization
db4o
【解决方案1】:
快速回答:
Db4o 符合 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++;
}
}