Kom*_*ave 7 android marshalling serializable parcelable
我知道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()
不得将其用于持久存储:
public final byte [] marshall()
返回宗地的原始字节.
您在此处检索的数据不得放在任何类型的持久存储中(在本地磁盘上,通过网络等).为此,您应该使用标准序列化或其他类型的通用序列化机制.Parcel编组表示针对本地IPC进行了高度优化,因此不会尝试保持与在不同版本的平台中创建的数据的兼容性.
所以现在我被卡住了.我可以忽略这个警告并遵循我上面概述的路线,或者通过扩展Parcelable
我想要序列化和创建定制序列化方法的每个人来避免这个问题,这似乎非常浪费时间和精力.
有没有人知道Parcelable
没有使用序列化对象的'正确'快捷方式marshall()
?或者,如果不注意指定的警告,我应该继续吗?也许SQLite数据库是可行的方法,但我不确定并希望得到你的建议.
非常感谢.
sha*_*sha -2
对于任何需要序列化的对象,您都可以使用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
}
}
}
}`
Run Code Online (Sandbox Code Playgroud)
为了读取对象使用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;
}`
Run Code Online (Sandbox Code Playgroud)
问候,
沙
归档时间: |
|
查看次数: |
2219 次 |
最近记录: |