Warum bietet Android zwei Schnittstellen zum Serialisieren von Objekten? Interoperabelisierbare Objekte mit Android- Binder
und AIDL-Dateien?
quelle
Warum bietet Android zwei Schnittstellen zum Serialisieren von Objekten? Interoperabelisierbare Objekte mit Android- Binder
und AIDL-Dateien?
In Android können wir Objekte nicht einfach an Aktivitäten übergeben. Dazu müssen die Objekte entweder implementiert Serializable
oder eine Parcelable
Schnittstelle sein.
Serialisierbar
Serializable
ist eine Standard-Java-Schnittstelle. Sie können einfach die Serializable
Schnittstelle implementieren und Überschreibungsmethoden hinzufügen. Das Problem bei diesem Ansatz ist, dass Reflexion verwendet wird und es sich um einen langsamen Prozess handelt. Diese Methode erstellt viele temporäre Objekte und verursacht eine Menge Speicherbereinigung. Die Serializable
Schnittstelle ist jedoch einfacher zu implementieren.
Schauen Sie sich das folgende Beispiel an (serialisierbar):
// 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");
Paketierbar
Parcelable
Prozess ist viel schneller als Serializable
. Einer der Gründe dafür ist, dass wir den Serialisierungsprozess explizit beschreiben, anstatt ihn durch Reflexion abzuleiten. Es liegt auch nahe, dass der Code für diesen Zweck stark optimiert wurde.
Schauen 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 ArrayList
Paketobjekte wie folgt übergeben:
// 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");
Fazit
Parcelable
ist schneller als Serializable
SchnittstelleParcelable
Die Implementierung der Schnittstelle nimmt im Vergleich zur Serializable
Schnittstelle mehr Zeit in AnspruchSerializable
Schnittstelle ist einfacher zu implementieren Serializable
Die Schnittstelle erstellt viele temporäre Objekte und verursacht eine Menge SpeicherbereinigungParcelable
Array kann über Intent in Android übergeben werden
Serializable ist eine Standard-Java-Schnittstelle. Sie markieren einfach eine Klasse Serializable, indem Sie die Schnittstelle implementieren, und Java serialisiert sie in bestimmten Situationen automatisch.
Parcelable ist eine Android-spezifische Oberfläche, über die Sie die Serialisierung selbst implementieren. Es wurde entwickelt, um weitaus effizienter als Serializable zu sein und um einige Probleme mit dem Standard-Java-Serialisierungsschema zu umgehen.
Ich glaube, dass Binder und AIDL mit Paketobjekten arbeiten.
Sie können jedoch serialisierbare Objekte in Intents verwenden.
quelle
Parcelable vs Serializable Ich beziehe mich auf diese beiden.
Für Java und Kotlin
1) Java
Serialisierbar, die Einfachheit
Das Schöne an serialisierbar ist, dass Sie die serialisierbare Schnittstelle nur für eine Klasse und ihre untergeordneten Elemente implementieren müssen. Es handelt sich um eine Markierungsschnittstelle, dh es gibt keine zu implementierende Methode. Java wird einfach sein Bestes tun, um sie effizient zu serialisieren.
Das Problem bei diesem Ansatz ist, dass Reflexion verwendet wird und es sich um einen langsamen Prozess handelt. Dieser Mechanismus neigt auch dazu, viele temporäre Objekte zu erstellen und eine Menge Speicherbereinigung zu verursachen.
Paket, die Geschwindigkeit
Nun ist der Gewinner
Die Ergebnisse der von Philippe Breault durchgeführten Tests zeigen, dass Parcelable mehr als 10x schneller als Serializable ist. Einige andere Google-Ingenieure stehen ebenfalls hinter dieser Aussage.
Stop Stop !!!!, bevor Sie eine Entscheidung treffen
Und jetzt scheint ein Vergleich zwischen Parcelable und Custom Serializable fair zu sein! Die Ergebnisse können überraschend sein! Der benutzerdefinierte serielle Ansatz ist beim Schreiben mehr als dreimal schneller und beim Lesen 1,6-mal schneller als bei Parcelable.
Bearbeitet: -----
2) Kotlinx-Serialisierung
Kotlinx Serialization Library
Ihre
build.gradle
DateiDie Serialisierung ist recht einfach. Sie müssen die beabsichtigte Klasse mit der folgenden
@Serializable
Annotation versehenZwei weitere Anmerkungen sind
transient
undoptional
. Bei Verwendung von transient ignoriert der Serializer dieses Feld, und bei Verwendung von optional kann der Serializer nicht unterbrochen werden, wenn ein Feld fehlt. Gleichzeitig muss jedoch ein Standardwert angegeben werden.Hinweis : Dies kann auch mit Datenklassen funktionieren.
Für mehr
quelle
Serialization
.Quelle zu diesem Punkt: http://www.developerphil.com/parcelable-vs-serializable/
quelle
In Parcelable schreiben Entwickler benutzerdefinierten Code zum Marshalling und Unmarshaling, sodass im Vergleich zur Serialisierung weniger Müllobjekte erstellt werden. Die Leistung von Parcelable over Serialization wird aufgrund dieser benutzerdefinierten Implementierung erheblich verbessert (etwa doppelt so schnell).
Serialisierbar ist eine Markierungsschnittstelle, die impliziert, dass der Benutzer die Daten nicht gemäß seinen Anforderungen zusammenstellen kann. Bei der Serialisierung wird eine Marshalling-Operation auf einer Java Virtual Machine (JVM) unter Verwendung der Java Reflection API ausgeführt. Dies hilft bei der Identifizierung des Mitglieds und des Verhaltens des Java-Objekts, führt jedoch auch dazu, dass viele Müllobjekte erstellt werden. Aus diesem Grund ist der Serialisierungsprozess im Vergleich zu Parcelable langsam.
Bearbeiten: Was bedeutet Marshalling und Unmarshalling?
In wenigen Worten bezieht sich "Marshalling" auf den Prozess des Konvertierens der Daten oder der Objekte in einen Byte-Stream, und "Unmarshalling" ist der umgekehrte Prozess des Konvertierens des Byte-Stream-Beacks in ihre ursprünglichen Daten oder Objekte. Die Konvertierung erfolgt durch "Serialisierung".
http://www.jguru.com/faq/view.jsp?EID=560072
quelle
Ich werde tatsächlich derjenige sein, der sich für das Serializable einsetzt. Der Geschwindigkeitsunterschied ist nicht mehr so drastisch, da die Geräte weitaus besser sind als vor einigen Jahren und es auch andere, subtilere Unterschiede gibt. Weitere Informationen finden Sie in meinem Blogbeitrag zu diesem Thema.
quelle
Parcelable ist eine Art Standard in der Android-Entwicklung. Aber nicht wegen der Geschwindigkeit
Parcelable wird für die Datenübertragung empfohlen. Wenn Sie jedoch serialisierbar korrekt verwenden, wie in diesem Repo gezeigt , werden Sie feststellen, dass serialisierbar manchmal sogar schneller als paketierbar ist. Oder zumindest sind die Zeiten vergleichbar.
Ist Parcelable schneller als serialisierbar?
Also, wenn serialisierbar schneller und einfacher zu implementieren ist, warum hat Android überhaupt parcelable?
Der Grund ist nativer Code. Parcelable wird nicht nur für die Interprozesskommunikation erstellt. Es kann auch für die Intercode-Kommunikation verwendet werden . Sie können Objekte von der nativen C ++ - Ebene senden und empfangen. Das ist es.
Was solltest du wählen? Beides wird 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.
quelle
1. Serialisierbar
@see http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
Schnittstelle von was?
Geschwindigkeit
2. Paketierbar
@siehe http://developer.android.com/reference/android/os/Parcelable.html
Schnittstelle von was?
Geschwindigkeit
> Abschließend
Beachten Sie, dass Serializable eine Standard-Java-Oberfläche ist und Parcelable für die Android-Entwicklung vorgesehen ist
quelle
Es gibt einige Leistungsprobleme beim Marshalling und Unmarshaling. Parcelable ist doppelt so schnell wie Serializable.
Bitte gehen Sie über den folgenden Link:
http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development
quelle
Die Implementierung von Parcelable kann schneller sein, wenn Sie das Paracelable Plugin in Android Studio verwenden. Suche nach Android Parcelable Code Generator
quelle
Die serialisierbare Schnittstelle kann auf die gleiche Weise wie die parcelable-Schnittstelle verwendet werden, was zu (nicht viel) besseren Leistungen führt. Überschreiben Sie einfach diese beiden Methoden, um den manuellen Marshalling- und Unmarshalling-Prozess zu handhaben:
Dennoch scheint es mir, dass bei der Entwicklung von nativem Android die Verwendung der Android-API der richtige Weg ist.
Sehen :
quelle
Ich bin spät dran zu antworten, poste aber mit der Hoffnung, dass es anderen helfen wird.
In Bezug auf die Geschwindigkeit ,
Parcelable > Serializable
. Aber benutzerdefiniert serialisierbar ist Ausnahme. Es ist fast in Reichweite von Parcelable oder noch schneller.Referenz: https://www.geeksforgeeks.org/customized-serialization-and-deserialization-in-java/
Beispiel:
Benutzerdefinierte Klasse, die serialisiert werden soll
quelle
Parcelable viel schneller als mit Binder serialisierbar, da serialisierbar Reflexion verwenden und viele GC verursachen. Parcelable ist ein Design zur Optimierung des Objektdurchlaufs.
Hier ist ein Link zur Referenz. http://www.developerphil.com/parcelable-vs-serializable/
quelle
Sie können die serialisierbaren Objekte in den Absichten verwenden, aber zum Zeitpunkt der Serialisierung eines Parcelable-Objekts kann dies eine schwerwiegende Ausnahme wie NotSerializableException darstellen. Wird nicht empfohlen, mit Parcelable serialisierbar zu verwenden? Daher ist es besser, Parcelable um das Objekt zu erweitern, das Sie mit Bundle und Intents verwenden möchten. Da dieses Paket androidspezifisch ist, hat es keine Nebenwirkungen. :) :)
quelle
Serialisierbar
Serialisierbar ist eine markierbare Schnittstelle oder wir können sie als leere Schnittstelle aufrufen. Es sind keine Methoden vorimplementiert. Serializable konvertiert ein Objekt in einen Byte-Stream. So kann der Benutzer die Daten zwischen einer Aktivität an eine andere Aktivität übergeben. Der Hauptvorteil von serialisierbar ist, dass das Erstellen und Übergeben von Daten sehr einfach ist, aber im Vergleich zu parcelable ein langsamer Prozess ist.
Paketierbar
Paketfähig ist schneller als serialisierbar. Das Paket kann das Objekt in einen Bytestream konvertieren und die Daten zwischen zwei Aktivitäten weitergeben. Das Schreiben von paketfähigem Code ist im Vergleich zur Serialisierung etwas komplex. Es werden keine temporären Objekte mehr erstellt, während die Daten zwischen zwei Aktivitäten übertragen werden.
quelle