6

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

我们是否正确假设编组(无论是 Java 序列化还是 Android 打包)仅在以下情况下发生

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

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

4

2 回答 2

7

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

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

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

于 2010-08-25T14:26:12.163 回答
0

我认为它马上就会发生。而且我认为性能的提高是因为可序列化需要反射才能工作。我认为这与可序列化和可外部化之间的性能差异相同。

于 2010-08-24T11:14:39.830 回答