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

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

怎么了?我应该怎么做才能使这些数据在我的应用程序的不同 android 市场版本之间持久存在?

谢谢

4

1 回答 1

0

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

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

Java 序列化的问题在于它严重依赖于反射,如果底层类的实现发生变化,你就会被淹没。

于 2012-08-02T09:01:42.787 回答