2013-08-20 68 views
0

好的,我會盡可能地澄清這一點。我希望它在我得到答案之前不會被標記出來。爲什麼不能正確保存和加載這些序列化的變量?

我想序列化保存的類,它工作得很好。但是一些變量沒有正確加載。這裏是代碼: 我也標出了代碼工作和不工作的地方。

編輯:簡化代碼多一點。

類IM節省:(它的簡版)

public class classToSave implements Serializable { 


/** 
* 
*/ 
private static final long serialVersionUID = -5184436214950145051L; 

public static List<classToSave> classtosavelist = new ArrayList<classToSave>(); 

public static classToSave one = new OtherClass1("1", 1, 1, null, Item.1, 1); 
public static classToSave two = new OtherClass1("2", 1, 2, one , Item.2, 1); 
public static classToSave three = new OtherClass2("3", 1, 4, two , Item.3, 2); 

public boolean done = false;  < WONT LOAD/SAVE 
public int lvl = 0;    < WONT LOAD/SAVE 
transient protected String name; < OK 
protected int Xpos;    < OK 
protected int Ypos;    < OK 
public Skill parent;    < OK 
protected Item item;    < OK 
public int extra = 0;   < OK (This Works..) 



public classToSave(String s, int x, int y, Skill parent, Item item, int cost) { 
    this.name = s; 
    this.Xpos = x; 
    this.Ypos = y; 
    if(parent != null) { 
     this.Xpos += parent.Xpos; 
     this.Ypos += parent.Ypos; 
    } 
    this.parent = parent; 
    this.item = item; 
    add(this, s); 
} 

private void add(classToSave classtosave, String name) { 
    boolean flag = true; 
    for(int i = 0; i < skills.size(); i++) { 
     if(classtosavelist.get(i).getName().equalsIgnoreCase(name)) { 
      flag = false; 
     } 
    } 
    if(flag) { 
     classtosavelist.add(classtosave); 
    } 
} 

public int needPoints() { 
    return 1 + extra; 
} 

public boolean Done(int points) { 
    if(points >= needPoints()) { 
     this.done = true; 
    } 
    return this.done; 
} 

public int getLevel() { 
    return this.lvl; 
} 

public int MAXLevel() { 
    return 1; 
} 

public void LevelUp() { 
    if(this.lvl < MAXLevel()) { 
     this.lvl++; 
    } 
} 

public void Reset() { 
    this.lvl = 0; 
} 

public Item getRenderItem() { 
    return this.item; 
} 

public String getName() { 
    return this.name; 
} 

public Skill getParent() { 
    return this.parent; 
} 

public boolean isCompleteDone() { 
    return (getLevel() == MAXLevel() && done); 
} 

這裏是保存和負載:

private ClassToSave classtosave; 


private void save(String savename) { 
    if (externalStorageWriteable) { 
     try { 
      File file = new File(ctxt.getExternalFilesDir(null), savename); 
      FileOutputStream fos = new FileOutputStream(file, false); 
      ObjectOutputStream os = new ObjectOutputStream(fos); 

      os.writeObject(classtosave); 

      os.flush(); 
      os.close(); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void load(String savename) throws ClassNotFoundException, StreamCorruptedException, IOException { 
    if (externalStorageAvailable) { 
     File file = new File(ctxt.getExternalFilesDir(null), savename); 
     FileInputStream fis = new FileInputStream(file); 
     ObjectInputStream is = new ObjectInputStream(fis); 


     ClassToSave classtosave = (ClassToSave) is.readObject(); 

      for (int i=0; i < classtosave.classtosavelist.size(); i++) { 
       classtosave.classtosavelist.get(i).Done(classtosave.classtosavelist.get(i).needPoints()); < WORKS 
       classtosave.classtosavelist.get(i).isCompleteDone(); < DOENST WORK 
       classtosave.classtosavelist.get(i).getLevel(); < DOESNT WORK 


       if (classtosave.classtosavelist.get(i).done == true){ <DOESNT WORK 
        classtosave.classtosavelist.get(i).done = true; 
        classtosave.classtosavelist.get(i).LevelUp(); 
       } 

      } 

     } 

     is.close(); 

} 

很抱歉,如果括號內是不合適的。此代碼被屠殺(重命名和修改)以使其更具可讀性。

但基本上這個代碼是用於「技能樹」,它應該做的就是保存如果所說的技能是否完整。

如果需要確定,請告訴我。我還可以根據需要提供更多代碼。

+0

爲了更好地爲您提供幫助,請將代碼發佈爲演示您的問題的[SSCCE](http://www.sscce.org)。這允許用戶複製/粘貼並重現您的問題。即繼續你的屠殺,直到你有少數類(孤立地)編譯,其中一個類包含觸發問題的'main'方法。 –

+0

嗯。好。我需要將此轉換爲PC上的工作,因爲這是Android。 – Snhp9

回答

0

你的構造函數忽略了boolean和int。它應該是這樣的:

public classToSave(boolean done, int lvl, String s, int x, int y, Skill parent, Item 
item, int cost) { 
    this.done = done; 
    this.lvl = lvl; 
    ... 
} 
+0

似乎沒有工作。這可能與我現在如何加載它有關? – Snhp9

+0

同樣的事情。只有int Extra才能正確保存和加載。 – Snhp9

+0

除非在類classToSave中定製了readObject()和writeObject(),否則還需要獲取所有參數的getters。如果你不想修改你的構造函數,你也可以使用setter。 – hpid91

相關問題