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

时间:2010-08-24 07:46:23

标签: android marshalling bundle serializable parcelable

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

我们是否正确地假设只有在

的情况下进行编组(无论是Java序列化还是Android分区)
  1. 必须将数据传递给另一个进程,例如在RMI期间,或
  2. 组件(活动或服务)是否被销毁,实例状态必须写入磁盘?
  3. 我见过Android框架工程师(我相信是Dianne Hackborn)说应该使用Parcelable代替Serializable,因为前者要快得多。多快了?如果对象在大多数情况下都没有被编组,那么这是否会产生影响(假设我们对此的假设是对的)?

2 个答案:

答案 0 :(得分:6)

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

  • 一个Bundle基本上只是一个HashMap的包装器,但它支持包裹(即编组)内部地图及其内容
  • 如果您将一个值放入Bundle中,它将首先取消选中此内部地图,然后将该值放入该地图中
  • 取消对地图的疏忽:如果你试图访问它,它只会取消它(例如通过调用bundle.putParcelable())。即使这样,它也只能解决地图本身的问题,而不是它的价值。只有当您尝试实际访问这些值时(例如,使用bundle.getParcelable(“key”)),它才会取消值。换句话说,如果你包裹了Bundle中的内容,那么如果你再也不会再访问这些值,就不会出现无法解除的错误。

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

答案 1 :(得分:0)

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