我在很多论坛上搜索过,但还没有找到我的问题的答案。我已经在这个网站上阅读了很多与我有同样问题的人的主题,但其中大多数都使用了小程序和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在我的阅读方法,但我试过,无济于事...
任何帮助非常感谢:)
我已经回答了您的问题,但您不应该以二进制格式将您的对象存储在数据库中。无论何时,如果您添加或删除一个字段都对对象进行了修改,那么存储在数据库中的所有旧字符将无法被正确读取。你也不能做任何疑问,比如只选择名字以'rich'开头的殖民者。理想情况下,您想坚持的每个课程都应该在数据库中拥有自己的表格。 – Hiro2k 2012-03-20 21:56:37
那么,这实际上是一个我“工作”的Minecraft服务器的插件。它没有被使用,因此添加/删除字段问题现在不是真正的问题。我总是可以为旧文件创建更新程序,但我可不可以吗? – Perdog 2012-03-20 22:58:44
@ Hiro2k这是不正确的。添加或删除字段不会破坏序列化下的兼容性。这在Object Serialization Spcification的Object Versioning章节中有广泛的讨论。 – EJP 2012-03-20 23:20:18