【问题标题】:Error "java.io.StreamCorruptedException: invalid stream header: 5B424037"错误“java.io.StreamCorruptedException:无效的流标头:5B424037”
【发布时间】:2014-11-03 06:46:20
【问题描述】:

我有一个实现Serializable 接口的FootballPlayer 实体类。我正在使用 longblob 类型将此类中的对象保存到数据库表中。

这很好,但是从数据库中检索对象时,我得到了一个StreamCorruptedException

这是我的代码:

public FootballPlayer searchFBPlayer(String id){

        try {

            String sql = "SELECT * FROM player";
            ResultSet rs = DBConnection.getData(sql);
            // search for player
            while (rs.next()) {
                ByteArrayInputStream bais = new ByteArrayInputStream(rs.getBytes("fbPlayer"));
                //test
                if(bais==null) System.out.println("Null BAIS");
                else System.out.println("No Null BAIS");
                //test
                FootballPlayer fbp = (FootballPlayer) toObject(bais);
                if(fbp.getPlayerID().equals(id))
                    return fbp;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }


private Object toObject(ByteArrayInputStream arr){

        ObjectInputStream ins;
        try{
        ins = new ObjectInputStream(arr);
        return ins.readObject();
        }
        catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

要保存的代码:

public int addFootballPlayer(FootballPlayer player){

        byte[] data=toByte(player);
        String sql="INSERT INTO footballplayer(footballPlayer) VALUES('"+data+"')";
        return DBConnection.setData(sql);
    }

private byte[] toByte(Object obj){

        try{
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(obj);
        oos.flush();
        oos.close();
        bos.close();

        byte[] data = bos.toByteArray();
        return data;

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

这是我的堆栈跟踪:

java.io.StreamCorruptedException: invalid stream header: 5B424037
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
    at java.io.ObjectInputStream.<init>(Unknown Source)
    at com.league.database.DBAccess.toObject(DBAccess.java:67)
    at com.league.database.DBAccess.searchPlayer(DBAccess.java:34)
    at com.league.main.Test.main(Test.java:20)

我的代码中没有任何类型的网络,例如套接字。我做错了什么,我该如何解决这个问题?

【问题讨论】:

  • 您是如何将对象放入数据库的?你在 PreperedStatement 上使用了setObject(varID,objectToSerialize) 吗?考虑使用这里描述的方式javapapers.com/core-java/…
  • @Pshemo 我已经放了保存代码
  • @user3112250 看起来您将字节作为字符串发送,它不会为您的数组放置实际字节,但会在字节数组上使用toString() 方法的结果,这将生成类似[B@1db9742 的内容。尝试打印您尝试执行的sql 字符串,您会明白我的意思。考虑阅读我在之前评论中链接的教程。

标签: java java-io


【解决方案1】:

问题在于创建 SQL 的位置。此时您应该使用 PreparedStatement,并将数据作为参数传递:不将数据转换为字符串。

【讨论】:

    猜你喜欢
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多