¿Cuál es la diferencia entre Parcelable y Serialización utilizada en Android

Quiero saber exactamente,

  1. si debería usar la técnica parcelable o para enviar datos de una actividad a otra?
  2. ¿es obligatorio usar uno de ellos para enviar datos de uno a otro?
  3. ¿cuándo debería usarlos?
  4. y la diferencia exacta entre ellos y el rendimiento de ambos en aspectos de java.

Gracias por adelantado.


 public class GetSetClass implements Serializable {
    private int dt = 10;

    /** pass any object, drwabale */
    public int getDt() {
        return dt;
    }

    public void setDt(int dt) {
        this.dt = dt;
    }
}
32
¿Cuál es la necesidad de serialización de objetos en Android? ¿No podemos realizar la tarea sin serializar los objetos?
agregado el autor SRam, fuente
agregado el autor verisimilitude, fuente
Use mayúsculas para comenzar un nombre de clase ( GetSetClass o Getsetclass ).
agregado el autor keyser, fuente

5 Respuestas

Estos conceptos están relacionados con Inter Process Communication (IPC).

Al enviar datos entre dos aplicaciones, debemos asegurarnos de que ambas aplicaciones comprendan el formato de los datos que se envían.

Especialmente cuando está enviando valores de tipo de datos no primitivos como clases y objetos entre dos aplicaciones, debemos convertirlos en un formato comprensible del sistema operativo. O.S entiende solo los tipos primitivos (ints, chars, etc.). El motivo de la conversión es que tenemos que canal de comunicación O.S para transmitir los datos.

Este proceso de conversión de tipos no primitivos a primitivos y el envío a otra aplicación a través de un canal de comunicación se denomina Serialización. El proceso inverso se llama De serialización.

En Java, IPC depende en gran medida de Serializables para la serialización. Pero la serialización está diseñada teniendo en cuenta las aplicaciones de escritorio. Cuando realice IPC en aplicaciones móviles, debemos asegurarnos de que el proceso de IPC no sea demasiado pesado.

En términos simples, la serialización es un concepto pesado para IPC. Por lo tanto, en lugar de la serialización, Android optó por Binders para lograr una comunicación ligera entre procesos. Binders internamente depende en gran medida de las parcelas, para hacer el IPC. Los paquetes son serializables livianos. Se prefiere usar parcelas para ordenar objetos en flujos de bytes.

Nota: Binder IPC depende en gran medida del concepto de memoria compartida para asegurarse de que no haya mucha duplicación de datos mientras se comparte entre las aplicaciones.

25
agregado
No tengo idea de por qué esta respuesta no tiene ningún voto hasta ahora, es bastante completa y para ser honesto, una de las mejores para mí.
agregado el autor GoRoS, fuente
@vsvankhede Bueno, parece que hay un momento y lugar para todo y actualmente es el más votado.
agregado el autor GoRoS, fuente

si debería usar una técnica de serialización o parcelable para enviar datos de una actividad a otra.

Si está enviando datos/objetos de tipo no primitivo a otra actividad a través del intento , tiene que Serialize o implementar Parcelable para ese objeto . La técnica preferida es Parcelable ya que no afecta el rendimiento.

es obligatorio usar uno de ellos para enviar datos de uno a otro./¿Cuándo debería usarlos?

Solo es obligatorio/usado para enviar objetos de datos de tipo no primitivo.

y la diferencia exacta entre ellos y el rendimiento de ambos en aspectos Java.

Serialization does impact the performance. For more details check this link Android Parcelable and Serializable

19
agregado
@hi arun George, ¿por qué debería usar la serialización solo para tipos de datos no primitivos? y por qué es obligatorio solo para tipo de dat no primitivo?
agregado el autor SRam, fuente
ok gracias por responder una pregunta más ... ¿cuándo deberíamos usar Bundle para enviar datos y cuál es la necesidad de poner el objeto en Bundle intent.putExtras (String id, PRIMITIVE_DATA_TYPE) si utilizamos la serialización para enviar datos?
agregado el autor SRam, fuente
Los tipos de datos primitivos se pueden pasar de una actividad a otra usando intent.putExtras (String id, PRIMITIVE_DATA_TYPE) y accediendo en la otra actividad utilizando el getMethod() equivalente para ese tipo. Pero tal no es el caso para los tipos de datos definidos por el usuario y, por lo tanto, debe usar la serialización o Parcelable .
agregado el autor Arun George, fuente

Obtuve una muy buena explicación de la diferencia entre Parcelable y Serialización.

Para comenzar con su pregunta, aunque ha pasado mucho tiempo, puede ayudar a otros:

      
  1. ¿Debería usar la técnica de parcelación o serialización para enviar datos de una actividad a otra?
  2.   

Respuesta: Parcelable es la mejor opción (por qué se explica más adelante).

      
  1. ¿es obligatorio usar uno de ellos para enviar datos de uno a otro?
  2.   

Resp .: Sí, como el envío de datos (objetos) de uno a otro requiere que se escriban y recuperen secuencias de bytes, y esto se puede hacer mediante parcelación o serialización.

      
  1. ¿cuándo debería usarlos?
  2.   

Resp .: Esta parte ya respondió, es decir, pasar datos de una actividad a otra.

      
  1. y la diferencia exacta entre ellos y el rendimiento de ambos en aspectos de Java.
  2.   

Resp .: 1. Parcelable está bien documentado en el SDK de Android; la serialización, por otro lado, está disponible en Java.

  1. En Parcelable, los desarrolladores escriben código personalizado para calcular y desasignar, por lo que crea menos objetos basura en comparación con la serialización. El rendimiento de Parcelable over Serialization mejora drásticamente (alrededor de dos veces más rápido), debido a esta implementación personalizada.

  2. La serialización es una interfaz de marcador, lo que implica que el usuario no puede ordenar los datos de acuerdo con sus requisitos. En la serialización, se realiza una operación de cálculo de referencias en una máquina virtual Java (JVM) utilizando la API de reflejo de Java. Esto ayuda a identificar el miembro y el comportamiento de los objetos Java, pero también termina creando muchos objetos basura. Debido a esto, el proceso de serialización es lento en comparación con Parcelable.

Answer taken from: this link

See also:serialization explained

5
agregado

Java Serializable:- Serializable comes from standard Java and is much easier to implement all you need to do is implement the Serializable interface and add override two methods.
The problem with Serializable is that it tries to appropriately handle everything under the sun and uses a lot reflection to make determine the types that are being serialized. So it becomes a beefy Object.

Androids Parcelable:- Android Inter-Process Communication (AIPC) file to tell Android how is should marshal and unmarshal your object.It is less generic and doesn't use reflection so it should have much less overhead and be a lot faster.

Read More from http://www.3pillarglobal.com/blog/parcelable-vs-java-serialization-android-app-development

3
agregado
Resaltar el problema con la serialización le da a esta respuesta mi +1
agregado el autor Richard Le Mesurier, fuente

tanto el parcelamiento como la serialización son formas de ordenar y desmantelar los datos. en android esto se usa para pasar tipos de datos no primitivos entre componentes y procesos. en general, Android permite objetos serializables o parcelables, por lo que puede elegir su método. la excepción a eso es con las interfaces AIDL. los objetos deben ser parcelables para ser pasados ​​/ devueltos.

la serialización usa la reflexión para ordenar automáticamente y desmarcar datos. en la mayoría de los casos, la implementación de la interfaz de marcador es suficiente para que funcione. con el parcelamiento, debe escribir el código para ordenar y desempaquetar los datos usted mismo.

y por lo tanto, es por eso que el parcelamiento es más rápido. el objeto no necesita ser reflejado para descubrir los campos. es el reflejo que lo hace lento.

la serialización también tiene control de versiones integrado ... si intenta desasignar a una versión diferente de la clase del objeto que se organizó, el proceso fallará de manera predecible. con el parcelamiento, puede hacer lo mismo, pero debe implementarlo usted mismo agregando un "campo de versión a su objeto" y un código que verifique la versión cuando se desmarque.

Dicho esto, normalmente utilizo la serialización. con objetos simples no notarás la diferencia. siempre puede cambiar para usar el parcelamiento más adelante en el desarrollo si descubre problemas de rendimiento.

2
agregado