2010-08-24 16 views
6

Nos preguntamos si al usar Bundle con objetos serializables o parcelable, ¿cuándo ocurre la clasificación? ¿Tan pronto como lo pones en el paquete? Como los paquetes se usan principalmente para pasar datos entre dos pantallas (¡ni siquiera estamos hablando de IPC aquí!), No parece tener mucho sentido ordenar un objeto, ya que permanece en la memoria todo el tiempo, sin ?¿Un objeto serializable siempre se serializa cuando se coloca en un paquete?

¿Estamos justo en el supuesto de que marshalling (ya sea de Java serialización o parcelación Android) sólo ocurre si

  1. los datos deben ser transmitidos a otro proceso, por ejemplo, durante RMI, o
  2. el componente (actividad o servicio) se destruye y el estado de la instancia debe escribirse en el disco?

que he visto ingenieros marco Android (creo que fue Dianne Hackborn) dicen que se debe utilizar en lugar de ParcelableSerializable porque el primero es mucho más rápido. ¿Cuanto más rápido? ¿Y esto incluso marcará la diferencia si el objeto no se organiza la mayor parte del tiempo de todos modos (suponiendo que nuestras suposiciones sobre esto fueran correctas)?

Respuesta

6

Creo que lo he descubierto. Básicamente me pasé todo el último día y la mayor parte de hoy en la depuración a través del código fuente de Android Parcel y Bundle, y aquí es cómo funciona:

  • Un paquete es básicamente una envoltura alrededor de un HashMap, pero apoya a parcela (es decir mariscal) que mapa interno y su contenido
  • si se pone un valor en un paquete, primero unparcel este mapa interno, y luego simplemente poner el valor en ese mapa
  • unparceling el mapa sucede con pereza: se solo lo desbloqueará si está intentando acceder a él (por ejemplo, llamando a bundle.putParcelable()). Incluso entonces, solo se separará el mapa en sí, pero no sus valores. Solo cuando intentes acceder realmente a estos valores (por ejemplo, utilizando bundle.getParcelable ("clave")) también se deshace el valor. En otras palabras, si empaqueta algo que está dentro de un paquete, no se producirá un despliegue si nunca vuelve a acceder a estos valores.

Así general: NO, un valor que no se parcela simplemente poniéndolo en un paquete. En cambio, el parcelamiento ocurre al pasar el paquete a otro componente (actividad o servicio, por qué Android hace eso, no sé, ya que no está sucediendo técnicamente el IPC) o cuando de otra manera tiene que ser parcelado.

+0

descargo de responsabilidad: eso es más o menos lo que obtuve al depurar nuestra aplicación, por lo que vale. Leer el código fuente que está lleno de variables llamadas 'N' y' M' no es lo más agradable, así que tal vez me perdí algo :-) – Matthias

+0

descargo de responsabilidad 2: solo para evitar malentendidos, esas variables eran parte del código fuente de Bundle, no nuestro propio :-D – Matthias

0

Creo que sucede de inmediato. Y creo que el aumento del rendimiento se debe a la reflexión necesaria serializable para que funcione. Creo que es lo mismo que la diferencia de rendimiento entre serializable y externalizable.

Cuestiones relacionadas