2012-07-13 69 views
1

嗯,我有這個類遊戲我做,我試圖挽救ArrayList的音符。當我註銷時,它正確地打印大小,例如,如果我有5個筆記,當我註銷notes.getSize()時是5,但是當我登錄時,它被重置爲無。爲什麼不保存筆記?的Java序列化保存

public class Notes implements Serializable { 

    private static final long serialVersionUID = -4947870743226160329L; 
    private ArrayList<Note> notes = new ArrayList<Note>(30); 

    public class Note implements Serializable { 

     private static final long serialVersionUID = -4589885080580317958L; 

     private int color = 0; 
     private String text = ""; 

     public Note(int color, String text) { 
      this.setColor(color); 
      this.setText(text); 
     } 

     public void setText(String text) { 
      this.text = text; 
     } 

     public String getText() { 
      return text; 
     } 

     public void setColor(int color) { 
      this.color = color; 
     } 

     public int getColor() { 
      return color; 
     } 
    } 

    private transient Player player; 

    public Notes(Player p) { 
     this.player = p; 
    } 

    public void addNote(String text) { 
     System.out.println("Note Text: "+text); 
     if (text.length() > 50) { 
      player.getPackets().sendGameMessage("You can only enter notes up to 50 characters!"); 
      return; 
     } 
     if (notes.size() < 30) { 
      notes.add(new Note(0, text)); 
     } else { 
      player.getPackets().sendGameMessage("You cannot add more then 30 notes!"); 
      return; 
     } 
     int NoteId = notes.size() - 1; 
     player.getPackets().sendConfig(1439, NoteId); 
     player.getTemporaryAttributtes().put("selectedNote", NoteId); 
     refreshNotes(false); 
    } 

    public void addNote(String text, int color) { 
     notes.add(new Note(color, text)); 
    } 

    public void loadNotes() { 
     player.getPackets().sendIComponentSettings(34, 9, 0, 30, 2621470); 
     player.getPackets().sendHideIComponent(34, 3, false); 
     player.getPackets().sendHideIComponent(34, 44, false); 
     player.getPackets().sendIComponentText(34, 13, "Loading notes<br>Please wait..."); 
     player.getPackets().sendConfig(1439, -1); 
     refreshNotes(true); 
    } 

    public void refreshNotes(boolean sendStartConfigs) { 
     for (int i = 0; i < 30; i++) { 
      player.getPackets().sendGlobalString(149 + i, i < notes.size() ? notes.get(i).getText() : ""); 
     } 
     if (sendStartConfigs) { 
      for (int i = 1430; i < 1450; i++) 
       player.getPackets().sendConfig(i, i); 
     } 
     player.getPackets().sendConfig(1440, getFirstTotalColorValue()); 
     player.getPackets().sendConfig(1441, getSecondTotalColorValue()); 
    } 


    public int intColorValue(int color, int noteId) { 
     return (int) (Math.pow(4, noteId) * color); 
    } 

    public int getFirstTotalColorValue() { 
     int Color = 0; 
     for (int i = 0; i < 15; i++) { 
      if (notes.size() > i) 
       Color += intColorValue(notes.get(i).getColor(), i); 
     } 
     return Color; 
    } 

    public int getSecondTotalColorValue() { 
     int color = 0; 
     for (int i = 0; i < 15; i++) { 
      if (notes.size() > (i + 16)) 
       color += intColorValue(notes.get(i + 16).getColor(), i); 
     } 
     return color; 
    } 

    public void deleteSelectedNote() { 
     if ((int)player.getTemporaryAttributtes().get("selectedNote") > -1) { 
      int slot = (int) player.getTemporaryAttributtes().get("selectedNote"); 
      notes.remove(slot); 
      player.getTemporaryAttributtes().put("selectedNote", -1); 
      player.getPackets().sendConfig(1439, -1); 
      refreshNotes(false); 
     } 
    } 

    public void clear() { 
     notes.clear(); 
     refreshNotes(false); 
    } 

    public void editNote(String string, int index) { 
     notes.get(index).setText(string); 
     refreshNotes(false); 
    } 

    public void setColor(int color, int index) { 
     notes.get(index).setColor(color); 
     refreshNotes(false); 
    } 

    public void deleteNote(int slot) { 
     notes.remove(slot); 
     refreshNotes(false); 
    } 

    public void setNotes(ArrayList<Note> setNotes) { 
     notes = setNotes; 
     refreshNotes(false); 
    } 

} 

這裏是我管理節省

公共類SerializableFilesManager {

private static final String PATH = "data/characters/"; 
private static final String BACKUP_PATH = "data/charactersBackup/"; 

public synchronized static final boolean containsPlayer(String username) { 
    return new File(PATH + username + ".p").exists(); 
} 

public synchronized static Player loadPlayer(String username) { 
    try { 
     return (Player) loadSerializedFile(new File(PATH + username + ".p")); 
    } catch (Throwable e) { 
     Logger.handle(e); 
    } 
    try { 
     Logger.log("SerializableFilesManager", "Recovering account: " 
       + username); 
     return (Player) loadSerializedFile(new File(BACKUP_PATH + username 
       + ".p")); 
    } catch (Throwable e) { 
     Logger.handle(e); 
    } 
    return null; 
} 

public static boolean createBackup(String username) { 
    try { 
     Utils.copyFile(new File(PATH + username + ".p"), new File(
       BACKUP_PATH + username + ".p")); 
     return true; 
    } catch (Throwable e) { 
     Logger.handle(e); 
     return false; 
    } 
} 

public synchronized static void savePlayer(Player player) { 
    try { 
     storeSerializableClass(player, new File(PATH + player.getUsername() 
       + ".p")); 
    } catch (ConcurrentModificationException e) { 
     //happens because saving and logging out same time 
    } catch (Throwable e) { 
     Logger.handle(e); 
    } 
} 

public static final Object loadSerializedFile(File f) throws IOException, 
     ClassNotFoundException { 
    if (!f.exists()) 
     return null; 
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(f)); 
    Object object = in.readObject(); 
    in.close(); 
    return object; 
} 

public static final void storeSerializableClass(Serializable o, File f) 
     throws IOException { 

    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(f)); 
    out.writeObject(o); 
    out.close(); 
} 

private SerializableFilesManager() { 

} 

}

+0

您實現'Serializable',但我沒有看到你正在做的I/O的任何地方。你是否創建了一個'ObjectOutputStream'並在任何地方調用'writeObject()'? – 2012-07-13 08:51:49

+0

忘了添加該課程,現在就添加它。 – 2012-07-13 08:55:46

回答

2
  1. 難道不馬克球員瞬態/加載的類,因爲你正在保存它,暫時會阻止從0開始得到保存,並反序列化時會帶來玩家無效,的默認值。

  2. 你有沒有作中玩家級序列化?

  3. 它是被序列或無整個對象圖......短暫的目的是使序列化期間,不放過一個特定成員,這樣,序列化過程的順利進行。

  4. 例如,假設在一個遊戲中我們要保持玩家和該屆比賽時間的進展,但沒有開始和結束時間。所以開始和結束的時間可以是暫時的。

+0

是的Player類是可序列化的,但是我需要聲明這兩件事情來使它保存嗎? \t私人筆記notesClass;和 \t private Note note; – 2012-07-13 09:02:43

+0

我認爲Notes是Outer類,使得它的變量可以訪問自身,並向玩家提供Inner類(Note)... – 2012-07-13 09:06:32

1

你應該保存在您的ArrayList:

FileOutputStream fos = null; 
    ObjectOutputStream out = null; 
    try { 
     fos = new FileOutputStream("filename",false); 
     out = new ObjectOutputStream(fos); 
     out.writeObject(notes); 
     out.close(); 
     System.out.println("Object Persisted"); 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 

,當你打開你的項目,導入使用的ArrayList:

FileInputStream fos; 
    try { 
      fos = new FileInputStream("filename"); 
      ObjectInputStream oos = new ObjectInputStream(fos); 
      notes=(ArrayList) oos.readObject(); 
       fos.close(); 
      { 
      catch { 
     } 
1

那是因爲你的Playertransient ...我已試圖在其他示例上演示您的邏輯...當Player設置爲private時,序列化已成功並且所有數據都已加載ba CK。否則,在瞬態時,玩家引用是null,它只加載其他序列化字段,如int。即使世界上只有一個classtransient Player領域,NullPointerException的發生,但ArrayListsize > 0