2012-08-02 49 views
0

我有一個android應用程序,它存儲持續可序列化的對象,包含4個字符串數組列表。該對象存儲在內部存儲器中,每次應用程序啓動時都會恢復。它工作正常....問題是,當我在市場上推出一個新版本的應用程序,並且用戶下載並安裝較新的版本時,存儲的對象不能正確恢復,對象的四個陣列列表被恢復爲空。然後,用戶失去了以前版本的應用存儲數據。這是我必須解決的一個巨大問題。存儲(持久性)可序列化的對象不能正確地在我的應用程序的較新的市場版本中被正確地使用

這是我的序列化對象:

public class SaveState implements Serializable{ 
    public ArrayList <String> fNumbers = new ArrayList<String>(); 
    public ArrayList <String> fNames = new ArrayList<String>(); 
    public ArrayList <String> favNumbers = new ArrayList<String>(); 
    public ArrayList <String> favNames= new ArrayList<String>(); 
    public static SaveState instance=new SaveState(); 
} 

這些都是我用它來存儲和恢復這個持久化對象的方法:

public static void saveData(Context context){ 
     ObjectOutput out; 
     try {   
      File directory = context.getDir(STORE_DIRECTORY, Context.MODE_PRIVATE); //primero comprobamos si existe el directorio, y si no, lo creamos. 
      File outFile = new File(directory, "appSaveState.data"); 
      System.out.println("########## SAVING INTO: "+outFile.getAbsolutePath()); 
      out = new ObjectOutputStream(new FileOutputStream(outFile)); 
      out.writeObject(SaveState.instance); 
      out.close(); 
     } catch (Exception e) {e.printStackTrace();} 
    } 

    public static void loadData(Context context){ 
     ObjectInput in; 
     try { 
      File directory = context.getDir(STORE_DIRECTORY, Context.MODE_PRIVATE); //primero comprobamos si existe el directorio, y si no, lo creamos. 
      File inFile = new File(directory, "appSaveState.data"); 
      System.out.println("########## LOADING FROM: "+inFile.getAbsolutePath()); 
      in = new ObjectInputStream(new FileInputStream(inFile)); //intentamos cargar el fichero  
      SaveState.instance=(SaveState) in.readObject(); 
      in.close(); 
     } catch (Exception e) {e.printStackTrace();} 
    } 

記住這個代碼工作正常,如果的版本應用程序未更新。

有什麼不對?我應該如何讓這些數據在我的應用的不同安卓市場版本之間持續存在?

謝謝

+0

我不是這方面的專家,但我認爲序列化在某些情況下可能不一致。如果您使用像JSON或XML這樣可靠的東西,您將獲得穩定的結果。很抱歉,這對您當前的問題沒有幫助。 – Krylez 2012-08-02 08:57:41

回答

0

我會自己序列化數據,而不依賴Java對象序列化。

除了將對象寫入ObjectOutputStream,您可以將數據轉換爲XML文檔並將該文件寫入存儲器(無論如何,我認爲它是全部的字符串,所以不應該很難)。然後,您可以使用可用於處理XML的類讀取和寫入數據。在這種情況下,您知道磁盤上的數據總是可以通過您獲得的任何版本的程序來讀取。

Java序列化的問題是它很大程度上依賴於反射,並且如果基礎類的實現更改了,則會被洗掉。

+0

我知道還有其他方式來存儲數據,但我想學習如何用這種方式解決問題,謝謝你 – Pableras84 2012-08-02 09:03:04

相關問題