【发布时间】:2012-06-08 07:45:40
【问题描述】:
我有这门课:
public class SaveState implements Serializable {
private static final long serialVersionUID = 1L;
public List<String> downloadedMagazinesIds = new ArrayList<String>();//id's de revistas descargadas
public List<String> downloadedMagazinesSummaries = new ArrayList<String>();//página sumario de cada magazine
public List<FullMagazine> downloadedMagazines = new ArrayList<FullMagazine>();//todos los magazines bajados
public Magazines ms=null; //Esta clase contiene el array de previews de revistas generado con el parser de XML
}
我使用这些方法将类(SaveState 对象)存储在 sdcard 中,并再次将文件中的对象读入对象:
public static void saveData(){
ObjectOutput out;
try {
//primero comprobamos si existe el directorio, y si no, lo creamos.
File folder = new File(Environment.getExternalStorageDirectory() + "/C/");
if(!folder.exists())
folder.mkdirs();
File outFile = new File(Environment.getExternalStorageDirectory(), "/C/appSaveState.data");
out = new ObjectOutputStream(new FileOutputStream(outFile));
out.writeObject(saveState);
out.close();
} catch (Exception e) {e.printStackTrace();}
}
public static void loadData(){
ObjectInput in;
try {
File inFile = new File(Environment.getExternalStorageDirectory(), "/C/appSaveState.data");
in = new ObjectInputStream(new FileInputStream(inFile));
saveState=(SaveState) in.readObject();
in.close();
} catch (Exception e) {e.printStackTrace();}
}
我存储对象,每次我的应用程序关闭时,我每次打开我的应用程序时都从 sdcard 读取对象,它工作正常。当我创建更新版本的应用程序(1.01)时,问题就来了。当我启动应用程序并尝试从 sdcard 读取文件时,文件已被读取,但对象类的所有变量都是空的,而且它们真的不为空。
为什么我的代码不能正常工作?我该怎么做才能解决它?
【问题讨论】:
-
首先,摆脱你可怕的异常处理——你几乎不应该捕获
IOException,我不清楚e.printStackTrace()会去相关日志——你检查过它在哪里会去吗?此外,您的close调用应在finally块内。 -
我没有得到任何异常,我只是得到并清空对象
-
鉴于您的异常处理,如果您有异常,您肯定会通知吗?你能制作一个简短但完整的程序来演示这个问题吗?
-
Jon Skeet,你的意思是“删除异常”。是的我同意。捕获异常的可怕编码实践。
-
我也有同样的问题。当我为 Production 创建一个新版本时,它会读取旧对象,但它们都是空的(整数字段中的空值和零等)。我能够检索文件(流),它实际上不是空的。我没有在应用程序版本之间更改此对象,(我检查并仔细检查),但仍然..旧版本序列化的文件无法在新版本中读取。 serialVersionUID 已设置且相同(否则会异常)。
标签: java android serializable objectoutputstream objectinputstream