java.io.StreamCorruptedException:无效的流头:5B42403

java.io.StreamCorruptedException:无效的流头:5B42403,java,mysql,Java,Mysql,我在很多论坛上搜索过,但还没有找到我的问题的答案。我在这个网站上读过很多与我有相同问题的人的话题,但他们中的大多数人都在使用applet和servlet,与他们相比,我看不出我做错了什么 不管怎样,关于我的问题。我最近刚开始学习MySQL,所以如果你看到任何可怕的事情,请原谅我。我试图获取一个可序列化对象,并将其写入MySQL中的一个表中。根据我所做的研究,我发现我需要使用BLOB作为字段,并且需要使用字节[]对其进行写入。写作很好,没有问题,但当我试图阅读它时,我得到了上面的错误 我的写作方法

我在很多论坛上搜索过,但还没有找到我的问题的答案。我在这个网站上读过很多与我有相同问题的人的话题,但他们中的大多数人都在使用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数组连接到字符串。