Java 使用JDBC存储的w/JPA反序列化对象

Java 使用JDBC存储的w/JPA反序列化对象,java,serialization,jpa,jdbc,deserialization,Java,Serialization,Jpa,Jdbc,Deserialization,我有一个类,它序列化一个图像,并使用JPA从数据库中存储和检索它 我决定使用Base64而不是序列化来简化其他开发人员的过程,因此我在启动应用程序a时使用JDBC实现: 读取搜索序列化图像的表。 反序列化图像。 将映像作为Base64映像存储在不同的表中。 使用旧的序列化映像删除表和列。 唯一的问题是,当我使用以下代码反序列化图像时: byte[] buf = rs.getBytes(tableImageField); InputStream is = rs.getBlob(tableImage

我有一个类,它序列化一个图像,并使用JPA从数据库中存储和检索它

我决定使用Base64而不是序列化来简化其他开发人员的过程,因此我在启动应用程序a时使用JDBC实现:

读取搜索序列化图像的表。 反序列化图像。 将映像作为Base64映像存储在不同的表中。 使用旧的序列化映像删除表和列。 唯一的问题是,当我使用以下代码反序列化图像时:

byte[] buf = rs.getBytes(tableImageField);
InputStream is = rs.getBlob(tableImageField).getBynaryStream();
ObjectInputStream oip = new ObjectInputStream(is);
ImageSerializer imageRead = (ImageSerializer) oip.readObject();
oip.close();
is.close();
rs.close();
我得到以下例外情况:

java.io.StreamCorruptedException: unexpected block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1360)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at es.giro.girlabel.model.manager.AbstractManager.moveImageToCache(AbstractManager.java:199)
at es.giro.girlabel.model.manager.AbstractManager.upgradeDatabase(AbstractManager.java:158)
java.io.StreamCorruptedException: unexpected block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1360)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at es.giro.girlabel.model.manager.AbstractManager.moveImageToCache(AbstractManager.java:238)
at es.giro.girlabel.model.manager.AbstractManager.upgradeDatabase(AbstractManager.java:202)
序列化的字符串如下所示:

aced00057372002c65732e6769726f2e6769726c。。。b00000000049454e44ae42608278

正如James所评论的,我尝试使用以下方法将使用十六进制格式的序列化字符串转换为字节数组:

我得到了一个例外:

java.io.StreamCorruptedException: unexpected block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1360)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at es.giro.girlabel.model.manager.AbstractManager.moveImageToCache(AbstractManager.java:199)
at es.giro.girlabel.model.manager.AbstractManager.upgradeDatabase(AbstractManager.java:158)
java.io.StreamCorruptedException: unexpected block data
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1360)
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963)
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1346)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:368)
at es.giro.girlabel.model.manager.AbstractManager.moveImageToCache(AbstractManager.java:238)
at es.giro.girlabel.model.manager.AbstractManager.upgradeDatabase(AbstractManager.java:202)

字符串看起来像十六进制,而不是二进制字符串,您可能需要首先将其从十六进制转换为二进制


你是如何存储数据的?什么是数据库类型?

使用哪个JPA实现,使用哪个字段映射?在@OneToOne字段映射中使用eclipselink。为什么人们一直在数据库中保存媒体?啊!数据库类型是字符串。我会试着把它转换成bynary,并发布结果…我尝试使用这个十六进制到字节数组转换器:java.io.StreamCorruptedException:java.io.ObjectInputStream.readObject0ObjectInputStream.java:1360 at java.io.ObjectInputStream.defaultReadFieldsObjectInputStream.java:1963 atjava.io.ObjectInputStream.readSerialDataObjectInputStream.java:1887位于java.io.ObjectInputStream.ReadOrderinaryObjectInputStream.java:1770