2012-03-20 33 views
1

我在很多論壇上搜索過,但還沒有找到我的問題的答案。我已經在這個網站上閱讀了很多與我有同樣問題的人的主題,但其中大多數都使用了小程序和servlet,而且我看不出與他們相比我做了什麼錯誤。java.io.StreamCorruptedException:無效的流標題:5B42403

反正,對我的問題。我最近剛剛學習了MySQL,所以如果你看到任何可怕的東西,請原諒我。我想要一個可序列化的對象,並將它寫入MySQL中的一個表。從我做的研究中,我發現我需要使用BLOB作爲字段,並且我需要使用byte []寫入它。寫作工作正常,沒有問題,但是當我嘗試閱讀它時,出現上述錯誤。

我寫方法:

public void addColonist(String p, Colonist c) { 
     // Serializing the Colonist 
     ByteArrayOutputStream baos; 
     baos = new ByteArrayOutputStream(); 
     byte[] byteObject = null; 

     try { 
      out = new ObjectOutputStream(baos); 
      out.writeObject(c); 
      out.flush(); 
      out.close(); 
      baos.flush(); 

      byteObject = baos.toByteArray(); 
      baos.close(); 

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

     // Adding it to MySQL 
     sql.query("INSERT INTO colonistdb (`player`, `colonist`) VALUES('" + p + "', '" + byteObject + "')"); 
    } 

我的讀/找到方法:

public Colonist getColonist(String p) { 
     // Getting the object from MySQL 
     ResultSet rs = sql.query("SELECT `colonist` FROM colonistdb WHERE `player` = '" + p + "'"); 
     byte[] byteObject = null; 
     try { 
      if (rs.first()) { 
       byteObject = (byte[]) rs.getObject("colonist"); 
      } 
     } catch (SQLException e) { 
     return null; 
     } 

     if (byteObject == null) { 
      System.out.println("byteObject is null"); 
      return null; 
     } 

     // Deserializing it for use 
     ByteArrayInputStream bais; 
     Colonist colonist = null; 

     try { 
      bais = new ByteArrayInputStream(byteObject); 
      in = new ObjectInputStream(bais); 
      colonist = (Colonist) in.readObject(); 

      in.close(); 
      bais.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 
     System.out.println("Colonist successfully retrived"); 

     return colonist; 
    } 

從我讀了一堆的其他問題和帖子,我可能需要做的ObjectOutputStream在我的閱讀方法,但我試過,無濟於事...

任何幫助非常感謝:)

+0

我已經回答了您的問題,但您不應該以二進制格式將您的對象存儲在數據庫中。無論何時,如果您添加或刪除一個字段都對對象進行了修改,那麼存儲在數據庫中的所有舊字符將無法被正確讀取。你也不能做任何疑問,比如只選擇名字以'rich'開頭的殖民者。理想情況下,您想堅持的每個課程都應該在數據庫中擁有自己的表格。 – Hiro2k 2012-03-20 21:56:37

+0

那麼,這實際上是一個我「工作」的Minecraft服務器的插件。它沒有被使用,因此添加/刪除字段問題現在不是真正的問題。我總是可以爲舊文件創建更新程序,但我可不可以嗎? – Perdog 2012-03-20 22:58:44

+2

@ Hiro2k這是不正確的。添加或刪除字段不會破壞序列化下的兼容性。這在Object Serialization Spcification的Object Versioning章節中有廣泛的討論。 – EJP 2012-03-20 23:20:18

回答

2

您正在插入錯誤的數據。您需要使用PreparedStatement才能使其工作。

PreparedStatement pstmt = sql.prepareStatement("INSERT INTO colonistdb (`player`, `colonist`) VALUES(?,?)"); 
pstmt.setString(1, p); 
pstmt.setBytes(2, byteObject); 
pstmt.executeUpdate(); 
+0

我從表中讀取的方式會保持不變嗎? – Perdog 2012-03-20 23:05:33

相關問題