2012-12-28 2 views
-1

데이터베이스에서 내 자신의 클래스 "BallotPaper"의 특정 개체를 올바르게 검색하는 데 문제가 있습니다. 올바르게 보존하지만, ObjectInputStream 작성시에 예외가 Throw됩니다.데이터베이스에서 개체를 검색하는 동안 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) 

모든 답변에 감사드립니다.

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

ObjectOutputStream의 출력을 버퍼링 할 수있다 :

답변

0

flush() 추가. 또는 flush() 대신 close()을 호출 할 수 있습니다. 그러면 스트림을 다시 사용하면 안된다는 것이 분명해집니다.

+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

관련 문제