2016-05-13 27 views
0

我一直在試圖反序列化一個分數列表。我花了我整整一天在這裏尋找,但未能找到解決的辦法。我的代碼看起來是這樣的:另一個序列化問題

public class Score implements Comparable<Score>, Serializable { 
    private String name; 
    private int score; 
    // ....... 

} 

public class MySortedList<T> extends...implements...,Serializable { 

    private ArrayList<T> list; 
    // .... 
} 

public class ScoreManager { 

    private final String FILEPATH; 
    private final String FILENAME = "highscores.ser"; 

    private MySortedList<Score> scoreList; 

    public ScoreManager() { 

     File workingFolder = new File("src\\games\\serialized"); 
     if (!workingFolder.exists()) { 
      workingFolder.mkdir(); 
     } 
     FILEPATH = workingFolder.getAbsolutePath(); 

     if ((scoreList = loadScores()) == null) { 
      scoreList = new MySortedList<Score>(); 
     } 
    } 

    public void addScore(Score score) { 
     scoreList.add(score); 
     saveScores(); 
    } 

    public MySortedList<Score> getScoreList() { 
     return scoreList; 
    } 

    private void saveScores() { 
     try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File(FILEPATH, FILENAME)))) { 
     out.writeObject(scoreList); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 
} 

@SuppressWarnings("unchecked") 
private MySortedList<Score> loadScores() { 
    try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(FILEPATH, FILENAME)))) { 
     return (MySortedList<Score>) in.readObject(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 
} 

的loadScores()方法返回只是一個空MySortedList每次。 但是,程序在正確的位置成功創建了highscores.ser文件,我絕對沒有錯誤。 Score對象被正確添加到MySortedList對象中。

任何想法?也許值得一提的是,這是Swing製作的更大程序的一部分。在ScoreManager類中的方法當玩家死亡

+2

您是否獲得一個堆棧跟蹤?如果是這樣,請把它包括在這裏。 –

+0

我什麼都沒得到:( – Amoz

+0

你應該試試[SimpleXML](http://simple.sourceforge.net/)。 – ManoDestra

回答

-1

被稱爲只有當它能夠幫助,該代碼爲我工作:

class Score implements Comparable<Score>, Serializable{ 
    private int point; 
    public Score(int point) { 
     this.point = point; 
    } 
    public int getPoint(){ 
     return point; 
    } 
    @Override 
    public int compareTo(Score o) { 
     if (o.getPoint() == this.getPoint()) 
      return 0; 
     return this.point < o.getPoint() ? - 1 : 1; 
    } 
    public String toString() { 
     return "points: " + point; 
    } 

} 
class MyList<T> implements Serializable { 
    private ArrayList<T> list = new ArrayList<>(); 
    public void add(T e){ 
     list.add(e); 
    } 
    public void show() { 
     System.out.println(list); 
    } 
} 

public class Main { 
    File workingFolder; 
    String FILEPATH; 
    private final String FILENAME = "highscores.ser"; 


    MyList<Score> list = new MyList<>(); 

    public static void main(String[] args) { 

     Main main = new Main(); 
     main.createFolder(); 
     main.addItems(); 
     main.saveScores(); 
     MyList<Score> tempList = main.loadScores(); 
     tempList.show(); 
     main.addMoreItems(); 
     main.saveScores(); 
     tempList = main.loadScores(); 
     tempList.show(); 
    } 
    private void addItems() { 
     Score sc = new Score(10); 
     list.add(sc); 
    } 
    private void addMoreItems() { 
     Score sc1 = new Score(20); 
     list.add(sc1); 
     Score sc2 = new Score(30); 
     list.add(sc2); 
    } 
    private void createFolder() { 
     workingFolder = new File("src\\games\\serialized"); 
     if (!workingFolder.exists()) { 
      workingFolder.mkdir(); 
     } 
     FILEPATH = workingFolder.getAbsolutePath(); 
    } 

    private void saveScores() { 
     System.out.println("before save: " + list); 
      try (ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File(FILEPATH, FILENAME)))) { 
      out.writeObject(list); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 

    @SuppressWarnings("unchecked") 
    private MyList<Score> loadScores() { 
     try (ObjectInputStream in = new ObjectInputStream(new FileInputStream(new File(FILEPATH, FILENAME)))) { 
      return (MyList<Score>) in.readObject(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
}