我知道Parcelable
(快)和Serializable
(慢)之间的性能差异。但是,我需要持久存储某些应用程序信息,而不仅仅是在一个生命周期内,因此onSaveInstanceState和使用Parcelable对象的相关方法是不合适的。
所以我把注意力转向Serializable
。我主要有AbstractList
种类型存储 - 这很好,因为它们实现了Serializable
。但是,我在其中存储的许多类型都是Parcelable
但不是Serializable
,例如RectF
。
我认为“没问题”,因为我可以通过Parcelable.writeToParcel(parcel, flags)
轻松生成包裹,然后在其上调用marshall()
来创建byte[]
我可以序列化和反序列化。我想我会使用泛型;创建一个SerializableParcelable<Parcelable> implements Serializable
类,为我希望序列化的所有Parcelable
类型提供一个适合的解决方案。然后我会...将此包装器中的每个RectF存储在ArrayList
内,并且看好列表,其Parcelable
内容是可序列化的。
但是,API文档规定marshall()
不得用于持久存储:
公共最终字节[] marshall()
返回宗地的原始字节。
您在此处检索的数据不得放置在任何类型的永久存储中(在本地磁盘上,通过网络等)。为此,您应该使用标准序列化或其他类型的通用序列化机制。 Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试与在不同版本的平台中创建的数据保持兼容。
所以现在我被卡住了。我可以忽略这个警告并遵循我上面概述的路线,或者通过扩展每个人Parcelable
我想要序列化和创建定制的序列化方法来避免这个问题,这似乎非常浪费时间和精力。 / p>
有没有人知道在不使用Parcelable
的情况下序列化marshall()
对象的“正确”快捷方式?或者,如果不注意指定的警告,我应该继续吗?也许SQLite数据库是可行的方法,但我不确定并希望得到你的建议。
非常感谢。
答案 0 :(得分:-1)
对于您需要序列化的任何对象,您可以使用objectOutPutStream
。通过使用它,您可以将对象写入设备的文件系统。因此,这也可用于保存Parcelable
个对象。
以下是将对象保存到文件系统的代码。
public static void witeObjectToFile(Context context, Object object, String filename) {
ObjectOutputStream objectOut = null;
FileOutputStream fileOut = null;
try {
File file = new File(filename);
if(!file.exists()){
file.createNewFile();
}
fileOut = new FileOutputStream(file,false);
objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(object);
fileOut.getFD().sync();
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}finally {
if (objectOut != null) {
try {
objectOut.close();
} catch (IOException e) {
// do nowt
}
}
if (fileOut != null) {
try {
fileOut.close();
} catch (IOException e) {
// do nowt
}
}
}
}`
为了阅读对象使用ObjectInputStream
。找到以下代码。
public static Object readObjectFromFile(Context context, String filename) {
ObjectInputStream objectIn = null;
Object object = null;
FileInputStream fileIn = null;
try {
File file = new File(filename);
fileIn = new FileInputStream(file);//context.getApplicationContext().openFileInput(filename);
objectIn = new ObjectInputStream(fileIn);
object = objectIn.readObject();
} catch (FileNotFoundException e) {
// Do nothing
}catch (NullPointerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
if (objectIn != null) {
try {
objectIn.close();
} catch (IOException e) {
// do nowt
}
}
if(fileIn != null){
try {
fileIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return object;
}`
的问候,
沙