Warum bietet Android 2 Schnittstellen für die Serialisierung von Objekten? Interoptieren serialisierbare Objekte mit Android Binder
und AIDL-Dateien?
Antworten
Zu viele Anzeigen?In Android können wir nicht einfach Objekte an Aktivitäten übergeben. Um dies zu tun, müssen die Objekte entweder Serializable
o Parcelable
Schnittstelle.
Serialisierbar
Serializable
ist eine Standard-Java-Schnittstelle. Sie können einfach implementieren Serializable
Schnittstelle und fügen Sie Überschreibungsmethoden hinzu. Das Problem bei diesem Ansatz ist, dass Reflexion verwendet wird und es ein langsamer Prozess ist. Bei dieser Methode werden viele temporäre Objekte erstellt, und es fällt eine Menge Müllabfuhr an. Wie auch immer, Serializable
Schnittstelle ist einfacher zu implementieren.
Sehen Sie sich das folgende Beispiel an (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;
}
// return age
public int 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");
Paketfähig
Parcelable
Prozess ist viel schneller als Serializable
. Einer der Gründe dafür ist, dass wir den Serialisierungsprozess explizit beschreiben, anstatt ihn mithilfe von Reflexion zu erschließen. Es liegt auch auf der Hand, dass der Code zu diesem Zweck stark optimiert wurde.
Sehen Sie sich das folgende Beispiel an (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");
Sie können passieren ArrayList
von paketfähigen Objekten wie unten beschrieben:
// 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");
Schlussfolgerung
Parcelable
ist schneller alsSerializable
interfazParcelable
Schnittstelle benötigt mehr Zeit für die Implementierung im Vergleich zuSerializable
interfazSerializable
Schnittstelle ist einfacher zu implementierenSerializable
Schnittstelle erzeugt eine Menge temporärer Objekte und verursacht eine Menge MüllabfuhrParcelable
Array kann über Intent in Android übergeben werden
Serialisierbar ist eine Standard-Java-Schnittstelle. Sie markieren eine Klasse einfach als serialisierbar, indem Sie die Schnittstelle implementieren, und Java wird sie in bestimmten Situationen automatisch serialisieren.
Paketfähig ist eine Android-spezifische Schnittstelle, bei der Sie die Serialisierung selbst implementieren. Sie wurde geschaffen, um weitaus effizienter zu sein als Serializable und um einige Probleme mit dem standardmäßigen Java-Serialisierungsschema zu umgehen.
Ich glaube, dass Binder und AIDL mit Parcelable-Objekten arbeiten.
Sie können jedoch serialisierbare Objekte in Intents verwenden.
In Parcelable schreiben die Entwickler benutzerdefinierten Code für das Marshalling und Unmarshalling, so dass im Vergleich zur Serialisierung weniger Garbage-Objekte entstehen. Aufgrund dieser benutzerdefinierten Implementierung verbessert sich die Leistung von Parcelable im Vergleich zur Serialisierung dramatisch (etwa zwei Mal schneller).
Serializable ist eine Marker-Schnittstelle, was bedeutet, dass die Benutzer die Daten nicht nach ihren Anforderungen umwandeln können. Bei der Serialisierung wird eine Marshalling-Operation auf einer Java Virtual Machine (JVM) unter Verwendung der Java Reflection API durchgeführt. Dies hilft bei der Identifizierung der Mitglieder und des Verhaltens des Java-Objekts, führt aber auch dazu, dass eine Menge von Müllobjekten erzeugt wird. Aus diesem Grund ist der Serialisierungsprozess im Vergleich zu Parcelable langsam.
Edita: Was ist die Bedeutung von Einrücken und Ausrücken?
In wenigen Worten: "Marshalling" bezieht sich auf den Prozess der Konvertierung von Daten oder Objekten in einen Byte-Stream, und "Unmarshalling" ist der umgekehrte Prozess der Konvertierung des Byte-Streams zurück in die ursprünglichen Daten oder Objekte. Die Konvertierung wird durch "Serialisierung" erreicht.
Parcelable ist so etwas wie ein Standard in der Android-Entwicklung. Aber nicht wegen der Geschwindigkeit
Für Datenübertragungen wird der Ansatz "Paketfähig" empfohlen. Aber wenn Sie serializable richtig verwenden, wie in dieses Projektarchiv Sie werden sehen, dass serializable manchmal sogar schneller ist als parcelable. Oder zumindest sind die Timings vergleichbar.
Ist Parcelable schneller als Serializable?
Nein, wenn die Serialisierung richtig durchgeführt wird.
Die übliche Java-Serialisierung auf einem durchschnittlichen Android-Gerät (wenn sie richtig gemacht wird *) ist etwa 3,6 Mal schneller als Parcelable beim Schreiben und etwa 1,6 Mal schneller beim Lesen. Es beweist auch, dass die Java-Serialisierung (wenn sie richtig gemacht wird) ein schneller Speichermechanismus ist, der selbst bei relativ großen Objektgraphen von 11000 Objekten mit jeweils 10 Feldern akzeptable Ergebnisse liefert.
* Die Nebenbemerkung ist, dass normalerweise jeder, der blindlings behauptet, dass "Parcelable schneller ist", es mit der standardmäßigen automatischen Serialisierung vergleicht, die viel Reflection verwendet. Das ist ein unfairer Vergleich, denn Parcelable verwendet ein manuelles (und sehr kompliziertes) Verfahren zum Schreiben von Daten in den Stream. Was in der Regel nicht erwähnt wird, ist, dass die standardmäßige Java-Serialisierung laut Dokumentation auch manuell durchgeführt werden kann, indem man die Methoden writeObject() und readObject() verwendet. Für weitere Informationen siehe JavaDocs. So sollte man es machen, um die beste Leistung zu erzielen.
Wenn serializable also schneller und einfacher zu implementieren ist, warum hat Android dann überhaupt parcelable?
Der Grund dafür ist der native Code. Parcelable ist nicht nur für die Kommunikation zwischen Prozessen gedacht. Es kann auch verwendet werden für Intercode-Kommunikation . Sie können Objekte aus der nativen C++-Schicht senden und empfangen. Das war's.
Was sollten Sie wählen? Beide werden gut funktionieren. Aber ich denke, dass Parcelable die bessere Wahl ist, da es von Google empfohlen wird und wie Sie aus diesem Thread sehen können, viel mehr geschätzt wird.
Wenn Sie ein guter Bürger sein wollen Parcelable zu implementieren, da es 10 Mal schneller arbeitet und weniger Ressourcen verbraucht.
In den meisten Fällen ist die Verlangsamung jedoch spürbar sein. Verwenden Sie es ruhig, aber denken Sie daran, dass die Serialisierung eine teure Operation ist, also beschränken Sie sie auf ein Minimum.
Wenn Sie versuchen, eine Liste mit Tausenden von serialisierten ist es möglich, dass der gesamte Vorgang mehr als eine Sekunde dauert. Es können sich Übergänge oder Drehungen vom Hochformat zum Querformat sehr träge.
Quelle bis zu diesem Punkt: http://www.developerphil.com/parcelable-vs-serializable/
- See previous answers
- Weitere Antworten anzeigen