我在很多論壇上搜索過,但還沒有找到我的問題的答案。我已經在這個網站上閱讀了很多與我有同樣問題的人的主題,但其中大多數都使用了小程序和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