我正在牆上碰撞我的頭。Java - NotSerializableException
這裏的交易:我做了一個BlockList類,我創建了一個塊列表。這個類是序列化的,Block類也是(也是我在Block類中使用的類RGB)。
因此,當我嘗試使用ObjectOutputStream將二進制文件保存到列表中時,一切正常。
但是,當我嘗試讀取文件時,我得到這個NotSerializable異常。我的意思是,列表中可能包含的所有類都是可序列化的。爲什麼我甚至會得到這個錯誤?
public void saveToHardDrive(){
try{
FileOutputStream fos = new FileOutputStream("blocks.bk", true);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(list);
oos.close();
}catch(IOException e){
System.out.println("ERREUR : erreur lors de la sauvegarde.");
}
}
public void loadFromHardDrive(){
try {
FileInputStream fis = new FileInputStream("blocks.bk");
ObjectInputStream ois = new ObjectInputStream(fis);
list = (ArrayList<Block>) ois.readObject();
ois.close();
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
如果有人能找到,我欠你一輩子。
PS:even weirder:當我嘗試加載文件時,該錯誤也提到了保存功能...即使我評論了所有的函數。
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: vector.Block
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at java.util.ArrayList.readObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeReadObject(Unknown Source)
at java.io.ObjectInputStream.readSerialData(Unknown Source)
at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
at java.io.ObjectInputStream.readObject0(Unknown Source)
at java.io.ObjectInputStream.readObject(Unknown Source)
at vector.BlockList.loadFromHardDrive(BlockList.java:60)
at vector.main.file(main.java:184)
at vector.Controls.Controls(Controls.java:57)
at vector.main.gameLoop(main.java:111)
at vector.main.main(main.java:171)
Caused by: java.io.NotSerializableException: vector.Block
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at java.util.ArrayList.writeObject(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at java.io.ObjectStreamClass.invokeWriteObject(Unknown Source)
at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
at java.io.ObjectOutputStream.writeObject0(Unknown Source)
at java.io.ObjectOutputStream.writeObject(Unknown Source)
at vector.BlockList.saveToHardDrive(BlockList.java:51)
at vector.main.file(main.java:189)
at vector.Controls.Controls(Controls.java:57)
at vector.main.gameLoop(main.java:113)
at vector.main.main(main.java:173)
編輯:這裏是塊類:
public class Block implements Serializable{
private float x;
private float y;
private float height;
private float length;
private RGB color;
public Block(float x, float y){
this.x = x;
this.y = y;
length = 100;
height = 100;
color = new RGB(1, 1, 1);
}
public Block(Player p){
setX(p.getX());
setY(p.getY());
setHeight(p.getHeight());
setLength(p.getLength());
setColor(new RGB(1, 1, 1));
}
public void render() {
Quad.renderQuad(this);
}
和RGB以防萬一:
public class RGB implements Serializable{
float r, g, b;
public RGB(float R, float G, float B){
r=R;g=G;b=B;
}
public String toString(){
return (r*250) + ", " + (g*250) + ", " + (b*250);
}
}
你可以添加你的Block類的代碼嗎? – Tyler
我編輯了我的文章 – Gaktan
嘗試聲明'list'您正在閱讀,作爲'Block []' – mangusta