Десериализация объекта с использованием JDBC, сохраненного с JPA - PullRequest
0 голосов
/ 21 марта 2012

У меня есть класс, который сериализует изображение, а также сохраняет и извлекает его из базы данных, используя 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)

1 Ответ

0 голосов
/ 21 марта 2012

Строка выглядит как шестнадцатеричная, а не двоичная строка, вам, вероятно, сначала нужно преобразовать ее из шестнадцатеричной в двоичную.

Как вы хранили данные?Какой тип базы данных?

...