2014-02-20 5 views
0

Я сейчас ударяю головой о стены.Java - NotSerializableException

Это сделка: Я создал класс BlockList, где создаю список блоков. Этот класс сериализуется, а также класс Block (а также класс RGB, который я использую в классе Block).

Итак, когда я пытаюсь сохранить список в двоичном файле с ObjectOutputStream, все работает отлично.

Но когда я пытаюсь прочитать файл, я получаю это исключение NotSerializable. Я имею в виду, что все мои классы, возможно, содержащиеся в списке, являются Serializable. Почему я даже получаю эту ошибку?

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: даже странно: когда я пытаюсь загрузить файл, ошибка также упоминает функцию сохранения ... Хотя я прокомментирую все функции.

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) 

Edit: Вот класс Блок:

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

try declaring '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

Смежные вопросы