2012-03-21 19 views
0

我有一個序列化圖像的類,並且存儲&使用JPA從數據庫中檢索它。使用JDBC存儲的反序列化對象(帶JPA)

我已經決定要使用的,而不是一個序列化,緩解了對其他開發人員的過程中Base64編碼,所以我是一個其使用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) 

序列化的字符串看起來像:

aced00057372002c65732e6769726f2e6769726c ..... ..... .... .... b00000000049454e44ae42608278

正如詹姆斯曾這樣評價,我曾嘗試使用這種方法來序列化的字符串(使用十六進制格式)轉換爲字節數組:

http://bit.ly/bncfKB

,並得到了異常:

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) 
+0

堅持使用哪個JPA實現,使用哪個字段映射? – DataNucleus 2012-03-21 13:32:36

+0

在@OneToOne字段映射中使用eclipselink。 – 2012-03-21 14:30:37

+0

爲什麼人們將媒體保存在數據庫中?啊! – Eldelshell 2012-04-02 09:47:34

回答

0

該字符串看起來像十六進制,而不是二進制字符串,您可能需要先將其從十六進制轉換爲二進制。

您是如何存儲數據的?什麼是數據庫類型?

+0

數據庫類型是一個字符串。我會嘗試將它轉換爲bynary,併發布結果... – 2012-03-22 10:40:41

+0

我已經嘗試使用此十六進制字節數組轉換器:http://bit.ly/bncfKB java.io.StreamCorruptedException:意外的塊數據 \t at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1360) \t在java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1963) \t在java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1887) \t在java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1770) – 2012-03-22 11:04:34