从 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 方法中包含该对象的类中出现错误,因为SerializableParcelable 都有这个方法。

有没有办法避免这种情况,或者只是一种我可以保存我的对象状态并轻松重新加载它的方法?

我看过几篇文章,但我对应该如何保存我的对象没有更多的了解。 提前致谢

【问题讨论】:

【参考方案1】:

我相信ParcelableSerializable 都以不同的方式和不同的表现达到了同一个目标。鉴于此,如果您的对象层次结构中的某个类已经实现了Parcelable 接口,您可以覆盖其writeToParcel 方法,为其调用超类(因此,如果超类的成员被实现,它们将被写入包中那种方式)然后,您应该将属性写入包裹,始终牢记您用于保存它们的顺序是您稍后将用于检索它们的顺序(FILO数据结构)

编辑

只需将您的对象投射到它抱怨的地方,并将冲突告诉您要使用的类,如下所述:https://***.com/a/13880819/2068693

【讨论】:

好的。我希望我不必完全重组我的意图工作方式来保存对象。不过还是谢谢你的回复。 我已经有一个 writeToParcel 方法,所以有什么方法可以让我把它放进去而不是仅仅发送一个意图? 很抱歉,Parcelable 并不是要持久化的,所以它无法实现与 Serializable API 相同的功能。 (***.com/a/15457376/2068693)。无论如何,您都必须实现 Serializable! 您的问题的答案是对您想要的课程进行强制转换,如此处所述***.com/a/13880819/2068693【参考方案2】:

我不知道你可以同时实现SerializableParcelable,但是要将一个类从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 接口 - 冲突的主要内容,如果未能解决你的问题,请参考以下文章

Parcelable实战

Parcelable实战

Parcelable实战

使用android中的可序列化将对象从第二个活动传递回主要活动

出现$ref的解决原因

Android:将对象从集合小部件传递到活动