Red de conocimiento informático - Aprendizaje de programación - La diferencia entre parcelable y serializable

La diferencia entre parcelable y serializable

Las funciones, eficiencia, diferencias y opciones entre Parcelable y Serializable:

1 Función

La función de Serializable es guardar las propiedades de los objetos en local. archivos y bases de datos, flujo de red y rmi para facilitar la transmisión de datos. Por supuesto, esta transmisión puede ser dentro de un programa o entre dos programas. La intención de diseño original de Parcelable de Android es que Serializable es demasiado lento. Está diseñado para transmitir datos de manera eficiente entre diferentes componentes del programa y entre diferentes programas de Android (AIDL). Estos datos solo existen en la memoria y Parcelable se comunica a través de mensajes IBinder. transportador.

Podemos ver las ventajas y desventajas del diseño anterior.

2. Eficiencia y selección

Parcelable tiene mejor rendimiento que Serializable y tiene menos sobrecarga de memoria. Por lo tanto, se recomienda utilizar Parcelable al transmitir datos entre memorias, como la transmisión de datos entre memorias. Las actividades Serializable pueden conservar los datos para facilitar el almacenamiento, así que elija Serializable cuando necesite guardar o transmitir datos a través de la red. Debido a que Parcelable puede ser diferente en diferentes versiones de Android, no se recomienda utilizar Parcelable para la persistencia de datos.

3. Implementación de programación

Para Serializable, la clase solo necesita implementar la interfaz Serializable y proporcionar una identificación de versión de serialización (serialVersionUID). Parcelable necesita implementar funciones writeToParcel, describeContents y variables CREATOR estáticas. De hecho, define cómo empaquetar y desempacar por sí mismo, y estas operaciones de serialización las implementa completamente la capa inferior.

Un ejemplo de implementación de Parcelable es el siguiente

[java] ver copia simple

clase pública MyParcelable implements Parcelable {

private int mData ;

cadena privada mStr

public int describeContents() {

retorno

}

// Escribir datos para guardar

public void writeToParcel(Parcel out, int flags) {

out.writeInt(mData

out.writeString(mStr);

}

// Objeto utilizado para crear Parcelable personalizado

public static final Parcelable.Creator CREATOR

= new Parcelable.Creator() {

public MyParcelable createFromParcel(Parcel in) {

return new MyParcelable(in

} p>

public MyParcelable[] newArray(int size) {

return new MyParcelable[size]

}

// Leer datos para recuperación

private MyParcelable(Parcel in) {

mData = in.readInt()

mStr = in. readString ();

}

}

De lo anterior podemos ver que los órdenes de escritura y lectura de Parcel son consistentes. Si el elemento es una lista, primero debe pasar una nueva ArrayList; de lo contrario, se informará una excepción de puntero nulo. De la siguiente manera:

list = new ArrayList();

in.readStringList(list);

PD: cuando lo use usted mismo, cuando lea datos Si los datos int anteriores se leen por error como largos, el orden posterior se desordenará y se informará la siguiente excepción. Cuando hay muchos campos de clase, el tipo y el orden de escritura y lectura deben ser consistentes.

11-21 20:14:10.317: E/AndroidRuntime(21114): Causado por: java.lang.RuntimeException: Parcela android.os.Parcel@4126ed60: Desglosando el código de tipo desconocido 3014773 en el desplazamiento 164

4. Funciones avanzadas

La serialización serializable no guarda variables estáticas. Puede usar la palabra clave Transient para no serializar algunos campos, o puede anular los métodos writeObject y readObject para lograr la serialización. Personalización de procesos