2010-04-30 61 views
3

我想將我的類中的一個對象存儲在文件中,然後才能從該文件加載對象。但在某個地方,我犯了一個錯誤,並且無法弄清楚在哪裏。我可以得到一些幫助嗎?加載/存儲Java文件中的對象

public class GameManagerSystem implements GameManager, Serializable { 

    private static final long serialVersionUID = -5966618586666474164L; 
    HashMap<Game, GameStatus> games; 
    HashMap<Ticket, ArrayList<Object>> baggage; 
    HashSet<Ticket> bookedTickets; 
    Place place; 


    public GameManagerSystem(Place place) { 
     super(); 

     this.games = new HashMap<Game, GameStatus>(); 
     this.baggage = new HashMap<Ticket, ArrayList<Object>>(); 
     this.bookedTickets = new HashSet<Ticket>(); 
     this.place = place; 
    } 
    public static GameManager createManagerSystem(Game at) { 
     return new GameManagerSystem(at); 
    } 

    public boolean store(File f) { 
     try { 
      FileOutputStream fos = new FileOutputStream(f); 
      ObjectOutputStream oos = new ObjectOutputStream(fos); 
      oos.writeObject(games); 
      oos.writeObject(bookedTickets); 
      oos.writeObject(baggage); 
      oos.close(); 
      fos.close(); 
     } catch (IOException ex) { 
      return false; 
     } 
     return true; 
    } 
    public boolean load(File f) { 
     try { 
      FileInputStream fis = new FileInputStream(f); 
      ObjectInputStream ois = new ObjectInputStream(fis); 
      this.games = (HashMap<Game,GameStatus>)ois.readObject(); 
      this.bookedTickets = (HashSet<Ticket>)ois.readObject(); 
       this.baggage = (HashMap<Ticket,ArrayList<Object>>)ois.readObject(); 
      ois.close(); 
      fis.close(); 
     } catch (IOException e) { 
      return false; 
     } catch (ClassNotFoundException e) { 
      return false; 
     } 
     return true; 
    } 
. 
. 
. 
} 


public class JUnitDemo { 

    GameManager manager; 

    @Before 
    public void setUp() { 
     manager = GameManagerSystem.createManagerSystem(Place.ENG); 
    } 

    @Test 
    public void testStore() { 
     Game g = new Game(new Date(), Teams.LIONS, Teams.SHARKS); 
     manager.registerGame(g); 
     File file = new File("file.ser"); 
     assertTrue(airport.store(file)); 
    } 
} 
+1

你正在看到什麼錯誤? – 2010-04-30 13:54:26

+1

我很好奇。由於整個對象是可序列化的,爲什麼不做oos.writeObject(this)呢? – 2010-04-30 14:21:00

+0

我得到NotSerializableException:( – 2010-04-30 14:27:56

回答

5

這個問題的解決方法是,當你使用的是其他的對象,讓說A類,到像HashMap集合,並希望序列化HashMap對象,然後implement接口SerializableA類是這樣的:

class A implements Serializable { 
} 

... 
    HashMap<Integer,A> hmap; 
... 

否則該對象將不可序列化。

我希望現在能解決這個問題。

0

嘗試oos.flush()關閉它之前。

+2

所有OutputStreams在關閉()之前執行flush() – 2010-04-30 14:16:49

+0

...至少那些實現得很好的包括JRE中的內容。 – 2010-04-30 14:17:24

0

請重新提示整個對象圖在序列化過程中保持不變。例如,如果您有一些對GUI類的引用,您也必須使它們可序列化,或將它們標記爲「transient」,以便Java不會序列化它們。