可串行化对象在放入捆绑包时是否总是被序列化?

Mat*_*ias 6 android bundle marshalling serializable parcelable

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

我们是否正确地假设编组(无论是Java序列化还是Android分区)只会发生

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

我见过Android框架工程师(我相信是Dianne Hackborn)说应该使用Parcelable而不是Serializable因为前者更快.多快了?如果对象在大多数情况下都没有编组,那么这是否会产生影响(假设我们对此的假设是正确的)?

Mat*_*ias 6

我想我已经明白了.我基本上花了整整一天和今天的大部分时间来调试Android ParcelBundle源代码,以下是它的工作原理:

  • Bundle基本上只是一个包装器HashMap,但它支持parcel(即marshal)内部地图及其内容
  • 如果将值放入Bundle中,它将首先取消该内部映射的分布,然后将该值放入该映射中
  • 取消映射是懒惰的:如果你试图访问它,它只会取消它(例如通过调用bundle.putParcelable()).即使这样,它也只能解决地图本身的问题,而不是它的价值.只有当您尝试实际访问这些值时(例如,使用bundle.getParcelable("key")),它才会取消值.换句话说,如果你包裹在Bundle中的某些东西,如果你再也不会访问这些值,那么就不会出现unarcelling.

所以一般来说:,只是将值放入Bundle中就不会分配值.相反,当将Bundle传递给另一个组件时,就会发生parcelling(活动或服务;为什么Android会这样做,我不知道,因为技术上没有IPC发生.)或者当它必须被分割时.