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

10

我过去常常使用Serializable对象将它们保存在文件系统中并读取它们以方便自己所需。但是,当需要在活动之间传递数据时,序列化速度很慢,因此我阅读了建议使用Parcelable。然后我这样做了,真的更快了!但现在,我遇到了一个小问题。由于Parcelable被优化用于IPC,它们不能被序列化并保存到文件中。所以我想知道是否有可能实现这个。

另外,如果我决定为我的类实现Parcelable和Serializable接口,但只使用Parcelable来传递数据,则我将能够将该类保存到文件中。但是我猜由于我使用了Serializable(仅用于保存,而不是传递数据),这不是一个好主意,对吧?

我也想使用Gson库,将类中的数据序列化成JSON,并将其保存到文件中,然后再使用Gson反序列化JSON以获取我的Parcelable对象。这是一个好主意吗?关于性能如何?

感谢大家的回答!

J.

3个回答

7

只需要使用context.getFilesDir(),并且使用java.io.ObjectInputStream和java.io.ObjectOutputStream即可。

另外,关于“Parcelable not now serializable”的解释并不是很有道理,因为Parcelable是一个接口,而不是你扩展的类。

因此,

class MyClass implements Parcelable, Serializable {   
}

应该能够正常工作。一旦您将对象读取和写入文件系统,Parcelable接口仍然可用。这只是一个接口。

我必须承认我还没有尝试过,但这就是我今天编写的内容,明天我会编写单元测试。

希望这有所帮助。


3
在使用类在意图中时,实现两个接口会成为一个问题,因为调用putExtra()现在是模棱两可的 - 它不知道您是在调用putExtra(name,parcelable)还是putExtra(name,serializable)。 - jhm
4
@jhm intent.putExtra(name, (Parcelable) object); @jhm intent.putExtra(name, (Parcelable) object); - TalkLittle
James Barwick非常感谢你,你的回答节省了我很多时间:D - Daiwik Dan

3

如果像你说的Parcelable和Serializable接口之间存在冲突,这里有另一种方法。 (虽然这不合理,但我会相信你,直到我完成明天的单元测试)...

请思考以下内容:

    Parcel p = Parcel.obtain();

    p.writeValue(asset);

    p.setDataPosition(0);

    byte [] b = p.marshall();

    p.recycle();

抱歉,刚刚阅读了marshall()的JavaDoc,它说不要将其存储到磁盘。它还说,“使用标准序列化来存储到磁盘”(引述)。所以,我的第一个答案应该可以解决你的问题。

-3

你尝试过使用共享首选项吗?如果你需要存储键值,这将是一个XML。


感谢Robert的回复。我考虑了一下,但如果我的类很大,如果我序列化它,JSON可能会很大,所以不确定将其存储在SharedPreferences中是否是一个好方法...我读到SharedPreferences必须用于存储首选项,而不是真正的数据,特别是如果它们很大。 - ejay
所以我想对于大数据,你应该使用数据库。 - Robert
1
在阅读了您的第一条回复后,我阅读了这篇文章:http://engineering.meetme.com/2014/03/android-tricks-and-tips-storing-a-pojo-into-shared-preferences/也许最终这是一个好主意? - ejay
在我看来,这是最快的方法之一。对于SQL数据库,您必须首先创建它并获取访问权限等等。在这里,您只需创建共享首选项(XML文件),因此需要编写的代码较少。此外,实现起来也很容易,您可以尝试添加一些良好的单元测试并查看其工作原理。或者与从卡中读取JSON文件进行比较? - Robert
是的,SP更易于使用,需要较少的代码,所以我会尝试一个测试台来比较两者并保留最好的。感谢您的帮助Robert! - ejay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接