Сохраненные (постоянные) сериализуемые объекты не могут быть правильно прочитаны в более новой рыночной версии моего приложения
У меня есть приложение для 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 Market?
Спасибо
1 ответ
Я бы сам сериализировал данные и не полагался на сериализацию объектов Java.
Вместо записи объектов в ObjectOutputStream вы можете преобразовать свои данные в XML-документ и записать этот файл в хранилище (я вижу, что в любом случае это все строки, поэтому это не должно быть сложным). Затем вы можете читать и записывать данные, используя классы, доступные для обработки XML. В этом случае вы знаете, что данные на диске всегда могут быть прочитаны любой версией вашей программы.
Проблема с сериализацией Java заключается в том, что она в значительной степени зависит от отражения, и если реализация базового класса изменится, вы окажетесь в затруднительном положении.