【发布时间】: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字符串,您会明白我的意思。考虑阅读我在之前评论中链接的教程。