Pourquoi Android propose-t-il 2 interfaces pour sérialiser des objets? Les objets sérialisables interagissent-ils avec les Binder
fichiers Android et AIDL?
la source
Pourquoi Android propose-t-il 2 interfaces pour sérialiser des objets? Les objets sérialisables interagissent-ils avec les Binder
fichiers Android et AIDL?
Dans Android, nous ne pouvons pas simplement transmettre des objets à des activités. Pour ce faire, les objets doivent implémenter Serializable
ou Parcelable
interfacer.
Sérialisable
Serializable
est une interface Java standard. Vous pouvez simplement implémenter l' Serializable
interface et ajouter des méthodes de remplacement. Le problème avec cette approche est que la réflexion est utilisée et c'est un processus lent. Cette méthode crée un grand nombre d'objets temporaires et provoque un certain ramassage des ordures. Cependant, l' Serializable
interface est plus facile à implémenter.
Regardez l'exemple ci-dessous (sérialisable):
// 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 à cela est que nous sommes explicites sur le processus de sérialisation au lieu d'utiliser la réflexion pour l'inférer. Il va également de soi que le code a été fortement optimisé à cet effet.
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 instance
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.getParcelableExtra("UniqueKey");
Vous pouvez passer ArrayList
d'objets Parcelable comme ci-dessous:
// 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
Parcelable
est plus rapide que l' Serializable
interfaceParcelable
l'interface prend plus de temps à mettre en œuvre par rapport à l' Serializable
interfaceSerializable
l'interface est plus facile à mettre en œuvre Serializable
L'interface crée beaucoup d'objets temporaires et provoque un peu de collecte des orduresParcelable
le tableau peut être transmis via Intent dans Android
Serializable est une interface Java standard. Vous marquez simplement une classe Serializable en implémentant l'interface, et Java la sérialisera automatiquement dans certaines situations.
Parcelable est une interface spécifique à Android où vous implémentez vous-même la sérialisation. Il a été créé pour être beaucoup plus efficace que Serializable et pour contourner certains problèmes avec le schéma de sérialisation Java par défaut.
Je crois que Binder et AIDL fonctionnent avec des objets Parcelable.
Cependant, vous pouvez utiliser des objets sérialisables dans Intents.
la source
Parcelable vs Serializable Je fais référence à ces deux.
Pour Java et Kotlin
1) Java
Sérialisable, la simplicité
La beauté de serializable est qu'il vous suffit d'implémenter l'interface Serializable sur une classe et ses enfants. Il s'agit d'une interface de marqueur, ce qui signifie qu'il n'y a pas de méthode à implémenter, Java fera simplement de son mieux pour la sérialiser efficacement.
Le problème avec cette approche est que la réflexion est utilisée et c'est un processus lent. Ce mécanisme a également tendance à créer un grand nombre d'objets temporaires et à provoquer un certain ramassage des ordures.
Parcelable, la vitesse
Maintenant, le gagnant est
Les résultats des tests effectués par Philippe Breault montrent que Parcelable est plus de 10 fois plus rapide que Serializable. Certains autres ingénieurs de Google soutiennent également cette déclaration.
Stop Stop !!!!, avant de prendre une décision
Et maintenant, une comparaison entre Parcelable et Serializable personnalisé semble juste! Les résultats peuvent être surprenants! L'approche Serializable personnalisée est plus de 3 fois plus rapide pour les écritures et 1,6 fois plus rapide pour les lectures que Parcelable.
Édité:-----
2) Sérialisation de Kotlinx
Bibliothèque de sérialisation Kotlinx
Votre
build.gradle
dossierLa sérialisation se fait assez facilement, vous devez annoter la classe voulue avec l'
@Serializable
annotation comme ci-dessousDeux autres annotations à noter sont
transient
etoptional
. L'utilisation de transitoire aura le sérialiseur ignorer ce champ et l'utilisation facultative permettra au sérialiseur de ne pas se casser si un champ est manquant, mais en même temps une valeur par défaut devra être fournie.Remarque : Cela peut également fonctionner avec des classes de données.
Pour plus
la source
Serialization
, Jetez un œil.Source à ce point: http://www.developerphil.com/parcelable-vs-serializable/
la source
Dans Parcelable, les développeurs écrivent du code personnalisé pour le marshaling et le démarshaling afin de créer moins d'objets inutiles par rapport à la sérialisation. Les performances de Parcelable sur la sérialisation s'améliorent considérablement (environ deux fois plus vite), grâce à cette implémentation personnalisée.
Sérialisable est une interface de marqueur, ce qui implique que l'utilisateur ne peut pas rassembler les données en fonction de ses besoins. Dans la sérialisation, une opération de marshaling est effectuée sur une machine virtuelle Java (JVM) à l'aide de l'API de réflexion Java. Cela permet d'identifier le membre et le comportement de l'objet Java, mais finit également par créer de nombreux objets inutiles. Pour cette raison, le processus de sérialisation est lent par rapport à Parcelable.
Edit: Quelle est la signification de marshalling et unmarshalling?
En quelques mots, "marshalling" fait référence au processus de conversion des données ou des objets en un flux d'octets, et "unmarshalling" est le processus inverse de conversion du beack du flux d'octets en leurs données ou objets d'origine. La conversion est réalisée par "sérialisation".
http://www.jguru.com/faq/view.jsp?EID=560072
la source
En fait, je vais être le seul à défendre le sérialisable. La différence de vitesse n'est plus aussi drastique car les appareils sont bien meilleurs qu'il y a plusieurs années et il y a aussi d'autres différences plus subtiles. Voir mon article de blog sur la question pour plus d'informations.
la source
Parcelable est une sorte de standard dans le développement Android. Mais pas à cause de la vitesse
Parcelable est l'approche recommandée pour les transferts de données. Mais si vous utilisez correctement sérialisable comme indiqué dans ce dépôt , vous verrez que sérialisable est parfois encore plus rapide que parcelable. Ou au moins les horaires sont comparables.
Parcelable est-il plus rapide que sérialisable?
Donc, si la sérialisation est plus rapide et plus facile à implémenter, pourquoi Android a-t-il du tout du lot?
La raison en est le code natif. Parcelable est créé non seulement pour la communication interprocessus. Il peut également être utilisé pour la communication intercode . Vous pouvez envoyer et recevoir des objets à partir de la couche native C ++. C'est tout.
Que choisir? Les deux fonctionnent bien. Mais je pense que Parcelable est un meilleur choix car il est recommandé par Google et comme vous pouvez le voir sur ce fil est beaucoup plus apprécié.
la source
1. Sérialisable
@see http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
Interface de quoi?
La vitesse
2. Colisable
@see http://developer.android.com/reference/android/os/Parcelable.html
Interface de quoi?
La vitesse
> En conclusion
Sachez que Serializable est une interface Java standard et Parcelable est destiné au développement Android.
la source
Il y a un problème de performances concernant le marshaling et le démarshaling. Parcelable est deux fois plus rapide que Serializable.
Veuillez passer par le lien suivant:
http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development
la source
L'implémentation de parcelable peut être plus rapide si vous utilisez le plugin paracelable dans Android Studio. rechercher le générateur de code Android Parcelable
la source
L'interface sérialisable peut être utilisée de la même manière que l'interface parcelable, ce qui entraîne (pas beaucoup) de meilleures performances. Remplacez simplement ces deux méthodes pour gérer le processus de marshaling et de dé-marshalling manuel:
Pourtant, il me semble que lors du développement d'Android natif, l'utilisation de l'API Android est la voie à suivre.
Voir:
la source
Je suis en retard dans la réponse, mais je poste avec l'espoir que cela aidera les autres.
En termes de vitesse ,
Parcelable > Serializable
. Mais, Serializable personnalisé est une exception. Il est presque à portée de Parcelable ou encore plus rapide.Référence: https://www.geeksforgeeks.org/customized-serialization-and-deserialization-in-java/
Exemple :
Classe personnalisée à sérialiser
la source
Parcelable beaucoup plus rapide que sérialisable avec Binder, car sérialisable utilise la réflexion et provoque de nombreux GC. Parcelable est conçu pour optimiser pour passer l'objet.
Voici le lien vers la référence. http://www.developerphil.com/parcelable-vs-serializable/
la source
vous pouvez utiliser les objets sérialisables dans les intentions mais au moment de faire sérialiser un objet Parcelable, 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 le bundle et les intentions. Comme ce Parcelable est spécifique à Android, il n'a donc aucun effet secondaire. :)
la source
Sérialisable
Serializable est une interface marquable ou nous pouvons appeler une interface vide. Il n'a pas de méthodes pré-implémentées. Sérialisable va convertir un objet en flux d'octets. Ainsi, l'utilisateur peut transmettre les données d'une activité à une autre. Le principal avantage de la sérialisation est la création et la transmission de données est très facile mais c'est un processus lent comparé à la parcellaire.
Parcelable
Le colis est plus rapide que sérialisable. Parcel able va convertir l'objet en flux d'octets et transmettre les données entre deux activités. L'écriture de code capable de colis est un peu complexe par rapport à la sérialisation. Il ne crée pas plus d'objets temporaires en passant les données entre deux activités.
la source