从 Android 中的对象实现 Serializable 和 Parcelable 接口 - 冲突
Posted
技术标签:
【中文标题】从 Android 中的对象实现 Serializable 和 Parcelable 接口 - 冲突【英文标题】:Implementing both Serializable and Parcelable interfaces from an object in Android - conflict 【发布时间】:2015-08-29 17:51:19 【问题描述】:我有一个对象,我必须保存到文件中以供重复使用。该对象的类已经实现了Parcelable
以在意图中使用。我将对象保存到文件的知识说要实现Serializable
,但是当我这样做时,我在意图的putExtra
方法中包含该对象的类中出现错误,因为Serializable
和Parcelable
都有这个方法。
有没有办法避免这种情况,或者只是一种我可以保存我的对象状态并轻松重新加载它的方法?
我看过几篇文章,但我对应该如何保存我的对象没有更多的了解。 提前致谢
【问题讨论】:
【参考方案1】:我相信Parcelable
和Serializable
都以不同的方式和不同的表现达到了同一个目标。鉴于此,如果您的对象层次结构中的某个类已经实现了Parcelable
接口,您可以覆盖其writeToParcel
方法,为其调用超类(因此,如果超类的成员被实现,它们将被写入包中那种方式)然后,您应该将属性写入包裹,始终牢记您用于保存它们的顺序是您稍后将用于检索它们的顺序(FILO数据结构)
编辑
只需将您的对象投射到它抱怨的地方,并将冲突告诉您要使用的类,如下所述:https://***.com/a/13880819/2068693
【讨论】:
好的。我希望我不必完全重组我的意图工作方式来保存对象。不过还是谢谢你的回复。 我已经有一个 writeToParcel 方法,所以有什么方法可以让我把它放进去而不是仅仅发送一个意图? 很抱歉,Parcelable 并不是要持久化的,所以它无法实现与 Serializable API 相同的功能。 (***.com/a/15457376/2068693)。无论如何,您都必须实现 Serializable! 您的问题的答案是对您想要的课程进行强制转换,如此处所述***.com/a/13880819/2068693【参考方案2】:我不知道你可以同时实现Serializable
和Parcelable
,但是要将一个类从Serializable
转换为Parcelable
,你可以使用这个插件:
android Parcelable 代码生成器。
首先删除实现 Serializable 然后使用 ALT + Insert 并单击 Parcelable
您可以生成您的类。
【讨论】:
【参考方案3】:您有除Serializable
以外的选项,但这可能会满足其他要求,例如避免依赖库。您可以使用 JSON 或 XML 将对象写入文件,这具有可读性的优势。您可能还需要考虑版本控制 - 当您有需要由包含新字段的类读取的文件时会发生什么。持久性会带来一些您可能没有来回传递 Bundles/Intents 的问题。
如果您选择Serializable
,我建议您对对象进行结构化,以便可以在Bundle
中写入和读取它们。使用static MyObject.make(Bundle)
方法和实例Bundle save()
方法将所有常量和读/写保存在一个位置。
【讨论】:
以上是关于从 Android 中的对象实现 Serializable 和 Parcelable 接口 - 冲突的主要内容,如果未能解决你的问题,请参考以下文章