2014-02-20 24 views
0

我正在牆上碰撞我的頭。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); 
} 

}

+1

你可以添加你的Block類的代碼嗎? – Tyler

+0

我編輯了我的文章 – Gaktan

+0

嘗試聲明'list'您正在閱讀,作爲'Block []' – mangusta

回答

3

在創建vector.Block Serializable之前創建了該文件。你必須重新創建它。

+0

我不確定我該怎麼做。 – Gaktan

+0

刪除.bk文件,已saveToHardDrive()被調用,然後嘗試loadFromHardDrive()再次 –

+0

如何可以在OP創建一個包含序列化列表如果塊不能序列文件? –

0

應該被序列化的所有類,必須實現Serializable -接口。

+1

*「我的意思是,可能包含列表中的所有我的班是Serializable接口。爲什麼我甚至得到這個錯誤?」 * 我相信OP已經解決了這個。 – christopher

+0

你說得對。對不起,我的錯,沒有看到這個。 – exception1

+0

沒問題。容易犯錯。 OP的術語並沒有使其一目瞭然。 – christopher