2012-02-17 20 views
30

Así que sé que se recomienda utilizar Parcelable en lugar de Serializable en Android, porque es más rápido.Android Parcelable y Serializable

Mi pregunta es: ¿es imposible evitar el uso de Serializable, verdad?

Si tengo un objeto personalizado quiero serializar, digamos que tengo la siguiente definición de clase

public class Person { 
    String name; 
    int Age; 
    ... 
    .... 
} 

Hacer este parcelable es fácil, porque la clase Persona contiene los tipos parcel.write *() soportes , es decir, hay parcel.writeString y parcel.writeInt

Ahora, lo que si la clase de persona es el siguiente:

public class PersonTwo { 
    MyCustomObj customObj; 
    String name; 
    int Age; 
    ... 
    .... 
} 

¿Cómo me supongo a la par cel el objeto MyCustomObj ?? Parece que necesito volver a utilizar serializable? pero, nuevamente, pensé que es LENTO usar serializable, y parece que no tenemos más remedio que usarlo en este caso.

No entiendo

alguien puede decirme cómo iba a parcelar PersonTwo en este caso?

+2

Le sugiero que use Serializable. Según las pruebas en Nexus 5, es mucho más rápido que Parcelable. Ver https://bitbucket.org/afrishman/androidserializationtest. Lo principal para recordar es que Serializable es lento solo con configuraciones predeterminadas. Si usa la serialización manual, es mucho, mucho más rápido. Verifique el enlace de arriba para más detalles. – nucleo

Respuesta

2

Usted necesita hacer MyCustomObj parcelable.

16

El enlace proporcionado por Ajay es exactamente lo que está buscando, cómo puede hacerlo. Bueno, lo que puede hacer es poner en práctica Parcelable a su CustomObject1 y crear una clase Parcelable para ello y entonces se puede utilizar esa clase de ParcelableParcel dentro de otra clase Parcelable que parcelar tanto el CustomObjects.

public class CustomObject1 implements Parcelable { 

    // parcelable code CustomObject1 
} 

public class CustomObject2 implements Parcelable { 

    private CustomObject1 obj1; 

    // add CustomObject1 here with getter setter 
    // parcelable code for CustomObject2 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeParcelable(obj1, flags); 
    } 
    private void readFromParcel(Parcel in) { 
     obj1 = in.readParcelable(CustomObject1.class.getClassLoader()); 
    } 
    ............ 
} 
+2

Gracias amigo, hubiera aceptado tanto a ti como a ajay como respuesta, pero parece que solo puedo elegir uno. ¡¡gracias de todas formas!! – user1118019

+1

Sí, esto es perfecto y cómo lo hago. Simplemente haga todos los objetos necesarios, parcelable porque, al final de todo, el objeto raíz contendrá tipos primitivos o String – jonney

-1

Llegué al punto en el que Parcelable es un problema para mí. En Android 4.3, obtengo una excepción deslumbrante, al pasar datos entre Actividades como Parcelable. Funciona bien en Android 4.0, 4.2 o 4.4. Debería funcionar cuando se cambie a Serializable, aunque es más lento.

+0

, eso es lo que experimento y veo en logcat ... – MartinC

+2

Agregue un código para que pueda ver también si el problema yace dentro de Android. – silverado

0

Todos los objetos compuestos también deben ser Parcelable. En caso de que quiera omitir un objeto, no lo use el método writeToParcel.

Cuestiones relacionadas