存储(持久)可序列化对象无法在我的应用程序的较新市场版本中正确读取

时间:2012-08-02 08:45:33

标签: android serialization inputstream objectinputstream

我有一个Android应用程序,它存储持久的可序列化对象包含4个字符串的arraylists。此对象存储在内部存储器中,每次应用程序启动时都会恢复。它工作正常....问题是,当我在市场上推出新版本的应用程序并且用户下载并安装较新版本时,存储的对象无法正常恢复,对象的四个arraylists被恢复为空。然后,用户丢失了以前版本的应用程序存储数据。这是一个我必须解决的巨大问题。

这是我的可序列化对象:

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();}
    }

请记住,如果未更新应用程序的版本,此代码可以正常工作。

有什么问题?我应该怎么做才能使这个数据在我的应用程序的不同Android市场版本之间保持不变?

由于

1 个答案:

答案 0 :(得分:0)

我会自己序列化数据而不依赖于Java对象序列化。

不是将对象写入ObjectOutputStream,而是可以将数据转换为XML文档并将该文件写入存储(无论如何,我看到它都是Strings,所以不应该很难)。然后,您可以使用可用于处理XML的类来读取和写入数据。在这种情况下,您知道您拥有的任何版本的程序都可以随时读取磁盘上的数据。

Java序列化的问题在于它很大程度上依赖于反射,如果底层类的实现发生了变化,那么你就会受到冲击。