402 votes

Android: Différence entre colis et sérialisable?

Pourquoi Android fournit-il 2 interfaces pour la sérialisation d'objets? Les objets sérialisables interagissent-ils avec les fichiers Android Binder et AIDL?

571voto

Sujith Points 700

Android, et nous savons qu'il ne suffit pas de passer des objets à des activités. Les objets doivent être implémente Serializable ou de l'interface Parcelable pour ce faire.

Serializable

Serializable est une interface Java standard. Vous pouvez simplement implémenter l'interface Serializable et ajouter de remplacer les méthodes.Le problème avec cette approche est que la réflexion est utilisé et c'est un processus lent. Cette méthode de créer un lot d'objets temporaires et de causer un peu de la collecte des ordures. L'interface Serializable est plus facile à mettre en œuvre.

Regardez l'exemple ci-dessous (Serializable)

//MyObjects Serializable class

import java.io.Serializable;
import java.util.ArrayList;
import java.util.TreeMap;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Serializable {

private String name;
private int age;

public ArrayList<String> address;

public MyObjects(String name, int age, ArrayList<String> address) {
    super();
    this.name = name;
    this.age = age;
    this.address = address;
}

public ArrayList<String> getAddress() {
    if (!(address == null))
        return address;
    else
        return new ArrayList<String>();
}

public String getName() {
    return name;

}

public String getAge() {
    return age;
}

}



//MyObjects instance
MyObjects mObjects = new MyObjects("name","age","Address array here");

//Passing MyObjects instance via intent
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);


//Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getSerializableExtra("UniqueKey");

Parcelable

Parcelable processus est beaucoup plus rapide que serializable. L'une des raisons pour cela est que nous sommes d'être explicite sur le processus de sérialisation au lieu d'utiliser la réflexion pour en déduire. Il va également de soi que le code a été largement optimisé pour cet usage.

Regardez l'exemple ci-dessous (Parcelable)

//MyObjects Parcelable class

import java.util.ArrayList;

import android.os.Parcel;
import android.os.Parcelable;

public class MyObjects implements Parcelable {

private int age;
private String name;

private ArrayList<String> address;

public MyObjects(String name, int age, ArrayList<String> address) {
    this.name = name;
    this.age = age;
    this.address = address;

}

public MyObjects(Parcel source) {
    age = source.readInt();
    name = source.readString();
    address = source.createStringArrayList();
}

@Override
public int describeContents() {
    return 0;
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeInt(age);
    dest.writeString(name);
    dest.writeStringList(address);

}

public int getAge() {
    return age;
}

public String getName() {
    return name;
}

public ArrayList<String> getAddress() {
    if (!(address == null))
        return address;
    else
        return new ArrayList<String>();
}

public static final Creator<MyObjects> CREATOR = new Creator<MyObjects>() {
    @Override
    public MyObjects[] newArray(int size) {
        return new MyObjects[size];
    }

    @Override
    public MyObjects createFromParcel(Parcel source) {
        return new MyObjects(source);
    }
};

}





MyObjects mObjects = new MyObjects("name","age","Address array here");

//Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putExtra("UniqueKey", mObjects);
startActivity(mIntent);


//Getting MyObjects instance
Intent mIntent = getIntent();
MyObjects workorder = (MyObjects) mIntent.getParcelable("UniqueKey");




//You can pass Arraylist of Parceble obect as below

//Array of MyObjects
ArrayList<MyObjects> mUsers;

//Passing MyOjects instance
Intent mIntent = new Intent(FromActivity.this, ToActivity.class);
mIntent.putParcelableArrayListExtra("UniqueKey", mUsers);
startActivity(mIntent);


//Getting MyObjects instance
Intent mIntent = getIntent();
ArrayList<MyObjects> mUsers = mIntent.getParcelableArrayList("UniqueKey");

Conclusion.

  1. Parcelable est plus rapide que l'interface serializable
  2. L'interface Parcelable prend plus de temps pour la mise en œuvre par rapport à l'interface serializable
  3. l'interface serializable est plus facile à mettre en œuvre
  4. l'interface serializable créer un grand nombre d'objets temporaires et de causer un peu de la collecte des ordures
  5. Parcelable tableau peut être passer par l'Intention de android

220voto

Cheryl Simon Points 25259

Serializable est une interface Java standard. Il vous suffit de marquer une classe Sérialisable par implemnting l'interface, et Java automatiquement sérialiser dans certaines situations.

Parcelable est un Android interface spécifique où vous mettez en œuvre la sérialisation vous-même. Il a été créé pour être beaucoup plus efficace que Serializable, et de contourner certains problèmes avec Java par défaut de sérialisation régime.

Je crois que Liant et AIDL travailler avec Parcelable objets.

Toutefois, vous pouvez utiliser des objets Sérialisables dans les Intentions.

42voto

codercat Points 5586

Si vous voulez être un bon citoyen, de prendre le temps supplémentaire pour mettre en œuvre Parcelable depuis, il va effectuer 10 fois plus rapidement et en utilisant moins de ressources.

Cependant, dans la plupart des cas, la lenteur de l'Sérialisable ne sera pas perceptible. N'hésitez pas à utiliser mais n'oubliez pas que la sérialisation est une opération coûteuse afin de le garder à un minimum.

Si vous essayez de passer une liste avec des milliers d'objets sérialisés, il est possible que l'ensemble du processus prendra plus d'une seconde. Il peut faire des transitions de rotation ou de portrait à paysage se sentir très lent.

2voto

Horyun Lee Points 81

Colisable beaucoup plus rapidement que sérialisable avec Binder, parce que sérialisable utilise la réflexion et provoque de nombreuses GC. Parcelable est conçu pour optimiser afin de transmettre un objet.

Voici le lien vers la référence. http://www.developerphil.com/parcelable-vs-serializable/

1voto

Rankush Agarwal Points 47

vous pouvez utiliser les objets sérialisables dans les intentions, mais au moment de faire sérialiser un objet pouvant être colis, il peut donner une exception sérieuse comme NotSerializableException. N'est-il pas recommandé d'utiliser sérialisable avec Parcelable. Il est donc préférable d’étendre Parcelable avec l’objet que vous souhaitez utiliser avec bundle et intent. Comme cette parcelle est spécifique à Android, elle n’a donc aucun effet secondaire. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X