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

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

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

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

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

【问题讨论】:

    标签: android marshalling bundle serializable parcelable


    【解决方案1】:

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

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

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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      相关资源
      最近更新 更多