422 Stimmen

Android: Unterschied zwischen Parcelable und Serializable?

Warum bietet Android 2 Schnittstellen für die Serialisierung von Objekten? Interoptieren serialisierbare Objekte mit Android Binder und AIDL-Dateien?

590voto

Sujith Punkte 7215

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

  1. Parcelable ist schneller als Serializable interfaz
  2. Parcelable Schnittstelle benötigt mehr Zeit für die Implementierung im Vergleich zu Serializable interfaz
  3. Serializable Schnittstelle ist einfacher zu implementieren
  4. Serializable Schnittstelle erzeugt eine Menge temporärer Objekte und verursacht eine Menge Müllabfuhr
  5. Parcelable Array kann über Intent in Android übergeben werden

224voto

Cheryl Simon Punkte 45901

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.

59voto

Utsav Punkte 5020

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.

http://www.jguru.com/faq/view.jsp?EID=560072

44voto

Maksim Turaev Punkte 3805

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.

43voto

codercat Punkte 22109

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/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X