2012-03-20 89 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

相关问题