2014-11-01 81 views
0

我有一個FootballPlayer實體類,它實現了Serializable接口。我正在使用longblob類型將此類中的對象保存到數據庫表中。錯誤「java.io.StreamCorruptedException:invalid stream header:5B424037」

這工作正常,但從數據庫檢索對象時,我得到StreamCorruptedException

這裏是我的代碼:

public FootballPlayer searchFBPlayer(String id){ 

     try { 

      String sql = "SELECT * FROM player"; 
      ResultSet rs = DBConnection.getData(sql); 
      // search for player 
      while (rs.next()) { 
       ByteArrayInputStream bais = new ByteArrayInputStream(rs.getBytes("fbPlayer")); 
       //test 
       if(bais==null) System.out.println("Null BAIS"); 
       else System.out.println("No Null BAIS"); 
       //test 
       FootballPlayer fbp = (FootballPlayer) toObject(bais); 
       if(fbp.getPlayerID().equals(id)) 
        return fbp; 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 


private Object toObject(ByteArrayInputStream arr){ 

     ObjectInputStream ins; 
     try{ 
     ins = new ObjectInputStream(arr); 
     return ins.readObject(); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

代碼保存:

public int addFootballPlayer(FootballPlayer player){ 

     byte[] data=toByte(player); 
     String sql="INSERT INTO footballplayer(footballPlayer) VALUES('"+data+"')"; 
     return DBConnection.setData(sql); 
    } 

private byte[] toByte(Object obj){ 

     try{ 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(bos); 
     oos.writeObject(obj); 
     oos.flush(); 
     oos.close(); 
     bos.close(); 

     byte[] data = bos.toByteArray(); 
     return data; 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

這裏是我的堆棧跟蹤:

java.io.StreamCorruptedException: invalid stream header: 5B424037 
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
    at java.io.ObjectInputStream.<init>(Unknown Source) 
    at com.league.database.DBAccess.toObject(DBAccess.java:67) 
    at com.league.database.DBAccess.searchPlayer(DBAccess.java:34) 
    at com.league.main.Test.main(Test.java:20) 

我沒有任何聯網的我的代碼,如套接字。我做錯了什麼,我該如何解決這個問題?

+0

可能的重複http://stackoverflow.com/questions/20773657/java-io-streamcorruptedexception-invalid-stream-header-00000001 – Tetramputechture 2014-11-01 20:26:21

+0

你是如何把你的對象數據庫?您是否在PreperedStatement上使用了'setObject(varID,objectToSerialize)'?考慮使用這裏描述的方式http://javapapers.com/core-java/serialize-de-serialize-java-object-from-database/ – Pshemo 2014-11-01 20:42:12

+0

@Pshemo我已經把代碼保存 – user3112250 2014-11-01 20:59:28

回答

0

問題是你創建SQL的關鍵。此時應該使用PreparedStatement,並將數據作爲參數傳遞:不將數據轉換爲String。

相關問題