我知道Parcelable
(快)和Serializable
(慢)之间的性能差异。但是,我需要持久存储某些应用程序信息,而不仅仅是在一个生命周期内,因此使用 Parcelable 对象的 onSaveInstanceState 和关联方法是不合适的。
于是我把注意力转向了Serializable
。主要是我有AbstractList
要存储的类型——这很好,因为它们实现了Serializable
. 但是,我在其中存储的许多类型都是Parcelable
但不是Serializable
,例如RectF
.
我认为“没问题”,因为我可以轻松地生成一个 Parcel,Parcelable.writeToParcel(parcel, flags)
然后调用marshall()
它来创建一个byte[]
我可以序列化和反序列化的 Parcel。我想我会使用泛型;创建一个类,为我希望序列化SerializableParcelable<Parcelable> implements Serializable
的所有类型提供一个适合的解决方案。Parcelable
然后我会例如将每个 RectF 存储在这个包装器中ArrayList
,并且你瞧,列表和它的Parcelable
内容是可序列化的。
但是,API 文档声明marshall()
不得用于持久存储:
公共最终字节 [] 马歇尔 ()
返回包裹的原始字节。
您在此处检索的数据不得放置在任何类型的持久存储中(在本地磁盘上、通过网络等)。为此,您应该使用标准序列化或另一种通用序列化机制。Parcel marshalled 表示针对本地 IPC 进行了高度优化,因此不会尝试保持与平台不同版本中创建的数据的兼容性。
所以现在我被困住了。我可以忽略此警告并遵循我上面概述的路线,或者通过扩展Parcelable
我想要序列化的每个人并创建定制的序列化方法来规避这个问题,这似乎非常浪费时间和精力。
有谁知道Parcelable
不使用序列化对象的“正确”快捷方式marshall()
?或者我应该在不注意指定警告的情况下继续耕种?也许 SQLite 数据库是要走的路,但我不确定,希望得到您的建议。
非常感谢。