gpt4 book ai didi

Android:是否有不使用 marshall() 从 Parcelable 到 Serializable 的快捷方式?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:17:50 25 4
gpt4 key购买 nike

我知道 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 ()

Returns the raw bytes of the parcel.

The data you retrieve here must not be placed in any kind of persistent storage (on local disk, across a network, etc). For that, you should use standard serialization or another kind of general serialization mechanism. The Parcel marshalled representation is highly optimized for local IPC, and as such does not attempt to maintain compatibility with data created in different versions of the platform.

所以现在我卡住了。我可以忽略此警告并按照上面概述的路线进行操作,或者通过扩展每个人来规避此问题 Parcelable我想序列化并创建定制的序列化方法,这似乎非常浪费时间和精力。

有谁知道序列化 Parcelable 的“正确”快捷方式?不使用 marshall() 的对象?还是我应该不理会指定的警告继续耕作?也许 SQLite 数据库是可行的方法,但我不确定并希望得到您的建议。

非常感谢。

最佳答案

对于您需要序列化的任何对象,您可以使用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;
}`

问候,

关于Android:是否有不使用 marshall() 从 Parcelable 到 Serializable 的快捷方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5896699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com