Android Intent 传递 parcelable 对象与传递 Json 字符串

Android Intent passing parcelable object vs passing Json string

我知道我的问题有一些答案,但答案不是很详尽或令人信服。 在我的程序中,为了将数据从一个 activity 传输到另一个,我将 POJO class 的内容转换为 Json 字符串并通过包(方法 1)传递。

方法 1

String jsonString = JacksonSingleton.getObjectMapper().writeValueAsString(object);
bundle.putExtra(KEY_STR, jsonString)

在方法 2 中,我在包中传递一个 Parcelable 对象。

方法2

bundle.putExtra(KEY_STR, parcelableObject);

如果我要实现方法 2,我将必须实现 Parcelable 接口并编写自定义代码来编组和解组我的 POJO class 字段。

我的问题是,就性能而言,这些方法中的哪一个是better/recommended?方法 1 很方便,但我想遵循最佳实践。

编辑: 如果你像我一样讨厌编写 'Parcelable' 样板代码,你可以将 Parcelable code generator 插件与 Android Studio/IntelliJ IDE 一起使用。它将自动生成编组和解组您的 class 字段的方法。非常好用,强烈推荐。


尽管我很讨厌回答自己的问题,但我想分享我的观察结果,以便将来帮助其他开发人员。

数据从一个 activity 到另一个的传输可以使用在 activity 意图中传递可序列化或可打包对象来完成。 Android 开发者网站推荐使用 Parcelable interface for this purpose.

但是,我的问题是关于传递 Parcelable 对象和 JSON 字符串之间的效率比较

为了对此进行测试,我使用了一台旧的低端 Android 设备。我通过在 activity 意图中发送一个大型 Parcelable 对象来启动 activity。接下来,我在 activity 意图中使用同一对象的 JSON 字符串启动了相同的 activity。我观察到的是在通过发送 JSON 字符串而不是 Parcelable 对象来启动 activity 时出现显着的可观察延迟。

总之,即使我们传递一个JSON字符串,Java String object always implements Serializable。 Google 建议使用 Parcelable 而不是 Serializable 对象。如果字符串的长度可以忽略不计,这通常是微不足道的。但是,在海量Json串海量对象的情况下,效率肯定会有所损失。

您可以参考此 performance benchmark of Parcelable vs Serializable


TLDR:

  • Parcelable - 更多样板代码、更好的性能和更好的整体工程实践。

  • Serializable - 代码更少,易于学习,如果您不沉迷于 performance/best 实践,也可以接受。

JSONobject/array是全球通用的,可以在internet上传输,我们可以在不同的平台上用不同的编程语言统一处理,方便保存。如果机器不是那么慢,数据不是那么大,我更喜欢使用JSON。

为什么要额外放置大量数据发送给另一个activity?有时我只是为存储的数据发送一个 ID 或者使用单例来处理对象......(另一个应用程序可以访问 Parcelable 对象吗?)

所以Parcelable是为了在同一个应用程序中使用跨进程..就像RemoteView和Service用它来传输数据方便...