2014-02-20 5 views
0

나는 지금 벽에 머리를 때리고있다.자바 - NotSerializableException

여기 거래가 있습니다. 블록 목록을 만드는 BlockList 클래스를 만들었습니다. 이 클래스는 Serialized이며 Block 클래스도 마찬가지입니다 (또한 Block 클래스에서 사용하는 RGB 클래스입니다).

그래서 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(); 
    } 
} 

누구나 쉽게 찾을 수 있다면 내 평생 동안 빚이 있습니다.

추신 : 이상한 파일 : 파일을로드하려고하면 오류가 저장 함수를 언급합니다 ... 비록 모든 기능에 주석을 달았습니다.

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