java.io.StreamCorruptedException:无效的流头:5B42403
我在很多论坛上搜索过,但还没有找到我的问题的答案。我在这个网站上读过很多与我有相同问题的人的话题,但他们中的大多数人都在使用applet和servlet,与他们相比,我看不出我做错了什么 不管怎样,关于我的问题。我最近刚开始学习MySQL,所以如果你看到任何可怕的事情,请原谅我。我试图获取一个可序列化对象,并将其写入MySQL中的一个表中。根据我所做的研究,我发现我需要使用BLOB作为字段,并且需要使用字节[]对其进行写入。写作很好,没有问题,但当我试图阅读它时,我得到了上面的错误 我的写作方法:java.io.StreamCorruptedException:无效的流头:5B42403,java,mysql,Java,Mysql,我在很多论坛上搜索过,但还没有找到我的问题的答案。我在这个网站上读过很多与我有相同问题的人的话题,但他们中的大多数人都在使用applet和servlet,与他们相比,我看不出我做错了什么 不管怎样,关于我的问题。我最近刚开始学习MySQL,所以如果你看到任何可怕的事情,请原谅我。我试图获取一个可序列化对象,并将其写入MySQL中的一个表中。根据我所做的研究,我发现我需要使用BLOB作为字段,并且需要使用字节[]对其进行写入。写作很好,没有问题,但当我试图阅读它时,我得到了上面的错误 我的写作方法
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;
}
从我在一堆其他问题和帖子上读到的内容来看,我可能需要在我的read方法中创建一个ObjectOutputStream,但我尝试了,但没有成功
非常感谢您的帮助:)您插入的数据有误。你需要使用一个工具来让它工作
PreparedStatement pstmt = sql.prepareStatement("INSERT INTO colonistdb (`player`, `colonist`) VALUES(?,?)");
pstmt.setString(1, p);
pstmt.setBytes(2, byteObject);
pstmt.executeUpdate();
我已经回答了您的问题,但是您不应该在数据库中以二进制格式存储对象。无论何时对对象进行修改(如添加或删除文件),都无法正确读取数据库中存储的所有旧文件。此外,您不能执行任何查询,例如仅选择名称以“rich”开头的殖民者。理想情况下,您不想持久化的每个类在数据库中都应该有自己的表。这实际上是我“工作”的minecraft服务器的一个插件。它没有被使用,所以添加/删除字段的问题现在不是一个真正的问题。我可以为旧文件做一个更新程序,但我不能吗?@Hiro2k这不正确。添加或删除字段不会破坏序列化下的兼容性。这将在对象序列化规范的对象版本控制一章中详细讨论。。。更新预先存在的列将如何工作?我可以执行以下操作吗?
UPDATE colonistdb SET colonist=“+byteObject+”WHERE player=“+c.getName()
No您必须再次使用准备好的语句,就像在回答中一样。您不能将byteObject数组连接到字符串。