将可序列化对象放入捆绑包时是不是总是被序列化?

Posted

技术标签:

【中文标题】将可序列化对象放入捆绑包时是不是总是被序列化?【英文标题】:Does a serializable object always get serialized when put in a bundle?将可序列化对象放入捆绑包时是否总是被序列化? 【发布时间】:2011-04-03 00:53:06 【问题描述】:

我们想知道当Bundle 与可序列化或可打包的对象一起使用时,编组实际上是在什么时候发生的?只要你把它放在包里?由于捆绑包主要用于在两个屏幕之间简单地传递数据(我们在这里甚至不讨论 IPC!),编组对象似乎没有多大意义,因为它一直保留在内存中,不?

我们是否正确地假设编组(无论是 Java 序列化还是 android 分块)仅在以下情况下才会发生

    必须将数据传递给另一个进程,例如在 RMI 期间,或 组件(活动或服务)被破坏并且必须将实例状态写入磁盘?

我见过 Android 框架工程师(我相信是 Dianne Hackborn)说应该使用 Parcelable 而不是 Serializable,因为前者要快得多。快多少?如果对象大部分时间都没有被编组(假设我们对此的假设是正确的),这甚至会产生影响吗?

【问题讨论】:

【参考方案1】:

我想我已经明白了。我基本上花了最后一天和今天的大部分时间来调试 Android ParcelBundle 源代码,它是这样工作的:

Bundle 基本上只是 HashMap 的包装器,但它支持打包(即编组)该内部映射及其内容 如果您将值放入 Bundle,它将首先解包此内部映射,然后简单地将值放入该映射中 地图解包是延迟发生的:只有在您尝试访问它时才会解包(例如,通过调用 bundle.putParcelable())。即使那样,它也只会解包地图本身,而不是它的值。只有当您尝试实际访问这些值(例如,使用 bundle.getParcelable("key"))时,它才会解包这些值。换句话说,如果您对 Bundle 中的某些内容进行打包,那么如果您不再访问这些值,则不会发生拆包。

所以一般来说:NO,一个值不是简单地通过将它放入一个Bundle来打包的。相反,当将 Bundle 传递给另一个组件(活动或服务;我不知道为什么 Android 会这样做,因为从技术上讲没有发生 IPC。)或必须以其他方式进行打包时,会发生打包。

【讨论】:

免责声明:这几乎是我从调试我们的应用程序中得到的,值得。阅读充满变量的源代码 NM 并不是最有趣的事情,所以也许我错过了什么:-) 免责声明 2:为了避免误解,这些变量是 Bundle 源代码的一部分,而不是我们自己的 :-D【参考方案2】:

我认为它会立即发生。而且我认为性能提高是因为可序列化需要反射才能工作。我认为这与serializable和externalizable的性能差异是一样的。

【讨论】:

以上是关于将可序列化对象放入捆绑包时是不是总是被序列化?的主要内容,如果未能解决你的问题,请参考以下文章

在可序列化类中传递对象捆绑意图

如何将可运行文件放入捆绑包中?

我需要在将对象放入 MySql 之前对其进行序列化吗? [复制]

序列化和反序列化

json数据重组

将捆绑包发送到其他进程