我有以下问题,需要最佳实践来解决:
我有一个带有Type数据列表的应用程序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
类中,该应用将崩溃。
解决此更新问题的最佳实践是什么?
在您的方案中使用序列化可能不是最佳选择。为避免崩溃,您可以使用serialVersionUID区分同一类的不同版本。
通过Java API:
序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,该序列号在反序列化期间用于验证序列化对象的发送者和接收者是否已加载了该对象的与序列化兼容的类。
如果接收者已为该对象加载了一个与相应发送者类具有不同的serialVersionUID的类,则反序列化将导致InvalidClassException。
可序列化的类可以通过声明一个名称为serialVersionUID的字段来显式声明其自己的serialVersionUID,该字段必须是静态的,最终的且类型为long。
您的数据模型是如此复杂,以至于无法在SQLite DB中编写吗?这将允许您有选择地处理模型的加载,跳过可能导致加载具有旧结构的新模型的空属性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句