2012-12-28 5 views
-1

У меня возникла проблема с возвратом должным образом определенного объекта моего собственного класса «BallotPaper» из базы данных. Он сохраняет правильно, но во время создания ObjectInputStream генерируется исключение.Java, JDBC: StreamCorruptedException при попытке получить объект из базы данных

Конечно, я прочитал много подобных вопросов и ответов здесь, но до сих пор не могу с этим справиться.

В базе данных у меня есть таблица со столбцом типа bytea (это postgreSQL), где я сохраняю свой объект.

Вот несколько строк кода:

//Saving the object 'paper' of the class 'BallotPaper' 
    PreparedStatement st = connection.prepareStatement(query); 
    ByteArrayOutputStream byos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(byos); 
    oos.writeObject(paper); 
    byte[] bytePaper = byos.toByteArray(); 
    st.setBytes(1, bytePaper); 
    st.executeUpdate(); 

    byos.close(); 
    oos.close(); 
    st.close(); 

//Trying to retrieve the object: 
    String query2 = "SELECT paper FROM voters WHERE id="+_id+";"; 
    Statement s = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
    ResultSet r = s.executeQuery(query2); 
    r.first(); 
    bytePaper = r.getBytes(1); 
    ByteArrayInputStream b = new ByteArrayInputStream(bytePaper); 
    ObjectInputStream o = new ObjectInputStream(b); // * 
    BallotPaper ba = (BallotPaper)o.readObject(); 

Исключение выбрасывается на линии до последней, отмеченные *.

Похоже, что:

java.io.StreamCorruptedException: invalid stream header: BB656430 
at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
at java.io.ObjectInputStream.<init>(Unknown Source) 
at slave.VotersDB.saveFilledPaper(VotersDB.java:162) 
at slave.ClientThread.prepareResponse(ClientThread.java:50) 
at slave.ClientThread.run(ClientThread.java:72) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Спасибо за все ответы.

ответ

0

Добавить flush():

oos.writeObject(paper); 
oos.flush(); 
byte[] bytePaper = byos.toByteArray(); 

ObjectOutputStream разрешено буфер свой выход. Вы могли бы вместо этого позвонить close(), а не flush(), что, по крайней мере, даст понять, что вы не должны использовать потоки снова.

+0

К сожалению, это не работает с flush(). После сохранения я закрываю все потоки. – brzeszczot

0

Мне, наконец, удалось решить проблему. Оказалось, что он не подходит для сохранения двоичных данных для использования метода setBytes(). Вместо этого следует использовать setBinaryStream().

С помощью первого метода байты сериализованного объекта полностью отличались от этих оригиналов. Кто-нибудь знает почему?

Вот правильный код:

PreparedStatement st = connection.prepareStatement(query);  

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
ObjectOutputStream oos = new ObjectOutputStream(baos); 
oos.writeObject(paper); 
byte[] bytePaper = baos.toByteArray(); 

PipedInputStream pis = new PipedInputStream(); 
PipedOutputStream pos = new PipedOutputStream(pis); 
pos.write(bytePaper); 
pos.flush(); 

st.setBinaryStream(1, pis,bytePaper.length); 

Способ извлечения не меняется.

+0

Каков тип столбца, в который вы вставляете? Это «BINARY», «VARBINARY», «RAW» или «BLOB»? Или это тип персонажа? – parsifal

Смежные вопросы