我遇到以下问题,需要一个最佳实践来解决它:
我有一个带有Foo
类型数据列表的应用。此列表(ArrayList<Foo>
)我使用以下命令保存到文件系统:
FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(MyList);
oos.close();
当我启动应用程序时,我将其加载:
FileInputStream fis = context.openFileInput(FILENAME);
ObjectInputStream ois = new ObjectInputStream(fis);
MyList = (ArrayList<Foo>) ois.readObject();
ois.close();
现在我的问题:我想用一些额外的属性扩展Foo
类。问题是,用户已保存旧列表并希望将其加载到新的Foo
类中,应用程序将崩溃。
解决此更新问题的最佳做法是什么?
答案 0 :(得分:1)
在您的场景中使用序列化可能不是最佳选择。为了避免崩溃,您可以使用serialVersionUID来区分同一类的不同版本。
来自Java API:
序列化运行时与每个可序列化的类a关联 版本号,称为serialVersionUID,在此期间使用 反序列化以验证发送者和接收者 序列化对象已加载该对象的类 兼容序列化。
如果接收者已经为具有a的对象加载了一个类 不同的serialVersionUID比相应的发送者的不同 class,然后反序列化将导致InvalidClassException。
可序列化类可以通过声明a来显式声明自己的serialVersionUID 名为serialVersionUID的字段必须是 static,final和long类型。
您的数据模型是否如此复杂以至于无法在SQLite DB中编写?这将允许您有选择地处理模型的负载,跳过可能导致加载具有较旧结构的新模型的null属性。