首页 > 解决方案 > 无法在休眠 5 中反序列化在休眠 3 中序列化的 blob

问题描述

我们正在将我们的应用程序从 Hibernate 3 迁移到 Hibernate 5.4 版本。

在 Hibernate 3 中,使用以下代码创建了 blob

ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(object); byte[] voBytes = byteOut.toByteArray(); Blob voBlob = Hibernate.createBlob(voBytes);

voBlob 存储在列中(作为 blob) - Oracle 数据库表

现在迁移后,当我们尝试读取 blob 并将其反序列化时,如下所示

try(ObjectInputStream in = new ObjectInputStream(blob.getBinaryStream())) { obj = in.readObject(); }

我们收到错误,上面写着

java.lang.ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo.javassist 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass。 SerializableProxy 在 java.base/java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2190) 在 java.base/java.io.ObjectStreamClass$FieldReflector.checkObjectFieldValueTypes(ObjectStreamClass.java:2153) 在 java.base/java。 io.ObjectStreamClass.checkObjFieldValueTypes(ObjectStreamClass.java:1407) 在 java.base/java.io.ObjectInputStream.defaultCheckFieldValues(ObjectInputStream.java:2426) 在 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2333)在 java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream。readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2410) 在 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2304) 在 java.base /java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java :2410) 在 java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io 的 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2304)。在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.) 的 ObjectInputStream.readObject0(ObjectInputStream.java:1646)java:422) 在 java.base/jdk.internal 的 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 的 java.base/java.util.HashMap.readObject(HashMap.java:1460)。 reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.base/java.lang.reflect.Method.invoke(Method. java:566)在 java.base/java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1160) 在 java.base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2271) 在 java.base/java.io .ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2410) 在爪哇。base/java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2304) 在 java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream. java:1646) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java :78) 在 HibernateUtils.main(HibernateUtils.java:48) 错误 java.lang.ClassCastException: 无法将 java.lang.String 的实例分配给 java.lang 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中的.Classbase/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream. java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) 错误 java.lang。 ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClassbase/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2142) 在 java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1646) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream. java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) 错误 java.lang。 ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClassObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) ) 错误 java.lang.ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass。 javassist.SerializableProxyObjectInputStream.readObject(ObjectInputStream.java:464) 在 java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:422) 在 HibernateUtils.readObjectFromFile(HibernateUtils.java:78) 在 HibernateUtils.main(HibernateUtils.java:48) ) 错误 java.lang.ClassCastException:无法将 java.lang.String 的实例分配给 org.hibernate.proxy.pojo 实例中 java.lang.Class 类型的字段 org.hibernate.proxy.pojo.javassist.SerializableProxy.identifierGetterMethodClass。 javassist.SerializableProxypojo.javassist.SerializableProxy.identifierGetterMethodClass 类型为 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中的 java.lang.Classpojo.javassist.SerializableProxy.identifierGetterMethodClass 类型为 org.hibernate.proxy.pojo.javassist.SerializableProxy 实例中的 java.lang.Class

我可以看到 SerializableProxy 类已从休眠 3 更改为休眠 5。有人可以建议我们现在如何进行吗?有没有办法反序列化 blob 并重建对象

标签: hibernateserializationdeserialization

解决方案


推荐阅读