Android - 将 Parcelable 数据保存到文件中

Posted

技术标签:

【中文标题】Android - 将 Parcelable 数据保存到文件中【英文标题】:Android - Save Parcelable data into a file 【发布时间】:2014-06-25 22:45:04 【问题描述】:

我曾经使用 Serializable 对象将它们保存在文件系统中并读取它们以做任何我想做的事情。但是当您必须在活动之间传递数据时,序列化速度很慢,所以我读到的建议是使用 Parcelable。然后我做到了,是的,它更快!但是现在,我有一个小问题。由于 Parcelable 针对 IPC 进行了优化,因此它们不可序列化并且无法保存到文件中。所以我想知道是否可以这样做。

另外,如果我决定为我的类实现 Parcelable 和 Serializable 接口,但只使用 Parcelable 在我的活动之间传递数据,我将能够将类保存到文件中。但我想,既然我使用可序列化(仅用于保存,不用于传递数据),这不是一个好主意嗯?

我也想过使用 Gson 库,从类中序列化数据,并将 JSON 保存到文件中,然后重用 Gson 反序列化 JSON 以获取我的 Parcelable 对象。这似乎是个好主意吗?性能怎么样?

感谢大家的回答!

J.

【问题讨论】:

【参考方案1】:

只需执行 context.getFilesDir() 并使用 java.io.ObjectInputStream 和 java.io.ObjectOutputStream。

另外,关于“Parcelable not now serializable”。这并不完全有意义,因为 Parcelable 在接口中,而不是您扩展的类中。

所以,

class MyClass implements Parcelable, Serializable    

应该可以正常工作。一旦你读取对象并将对象写入文件系统,Parcelable 接口仍然可以工作。它只是一个界面。

我不得不承认我没有尝试过,但这是我今天写的,明天我会写单元测试。

希望这会有所帮助。

【讨论】:

在意图中使用类时实现两个接口是一个问题,因为调用 putExtra() 现在不明确 - 它不知道您是调用 putExtra(name,parcelable) 还是 putExtra(名称,可序列化) @jhm intent.putExtra(name, (Parcelable) object); James Barwick 非常感谢,您的回答为我节省了很多时间:D【参考方案2】:

如果如您所说的 Parcelable 和 Serializable 接口之间存在冲突,这是另一种方法。 (同样,这没有意义,但我会相信你,直到我明天完成我的单元测试)......

想一想:

    Parcel p = Parcel.obtain();

    p.writeValue(asset);

    p.setDataPosition(0);

    byte [] b = p.marshall();

    p.recycle();

糟糕,只需阅读 marshall() 的 javaDoc,它说不要存储到磁盘。它还说,“使用标准序列化存储到磁盘”(释义)。

所以,我的第一个答案应该为你做。

【讨论】:

【参考方案3】:

您是否尝试使用共享首选项?如果您需要存储键值。此外,它将是一个 XML。

【讨论】:

感谢罗伯特的回复。我想过是的,但是如果我有一个大类,如果我序列化它,JSON 可能会很大,所以不确定将它存储在 SharedPreferences 中是否是一种好方法......我读到 SharedPreferences 必须用于存储偏好,而不是真正的数据,尤其是当它们很大时。 所以我想对于大数据你应该使用数据库 在阅读了您的第一个回复后,我读到了这个:engineering.meetme.com/2014/03/… 也许最后这是个好主意? IMO 这是最快的方法之一,您必须先创建 SQL 数据库才能访问等等,在这里您只需创建共享首选项(XML 文件),因此编写的代码更少,而且很小努力去做,所以也许你应该尝试添加一些好的单元测试,看看它是如何工作的?也许从卡中读取 json 文件进行一些比较? 是的,SP 更容易使用,要求的代码更少,所以我会尝试一个测试台来比较两者并保持最佳状态。感谢您的帮助罗伯特!

以上是关于Android - 将 Parcelable 数据保存到文件中的主要内容,如果未能解决你的问题,请参考以下文章

Android Parcelable和Serializable的区别

android中用Intent传数据,如果用传递的是一个类,就将类实现Parcelable接口

android中使用的Parcelable和Serialization有啥区别

Android:使用Parcelable接口在跳转Activity时传递数据以及错误信息 Parcel: unable to marshal value 的解决

Android:使用Parcelable接口在跳转Activity时传递数据以及错误信息 Parcel: unable to marshal value 的解决

Android 类 Parcelable 与 ArrayList