Android: разница между Parcelable и Serializable? - PullRequest
272 голосов
/ 24 июля 2010

Почему Android предоставляет 2 интерфейса для сериализации объектов? Сериализуемые объекты взаимодействуют с файлами Android Binder и AIDL?

Ответы [ 13 ]

397 голосов
/ 14 мая 2014

В Android мы не можем просто передавать объекты в действия. Для этого объекты должны реализовывать интерфейс Serializable или Parcelable.

Сериализуемый

Serializable - это стандартный интерфейс Java. Вы можете просто реализовать интерфейс Serializable и добавить методы переопределения. Проблема этого подхода заключается в том, что используется рефлексия, и это медленный процесс. Этот метод создает много временных объектов и вызывает довольно много мусора. Однако интерфейс 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 процесс намного быстрее, чем Serializable. Одна из причин этого заключается в том, что мы явно рассказываем о процессе сериализации, а не используем отражение для его вывода. Также очевидно, что код был сильно оптимизирован для этой цели.

Посмотрите на пример ниже (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");

Вы можете передать ArrayList объектов Parcelable, как показано ниже:

// 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");

Заключение

  1. Parcelable быстрее Serializable интерфейса
  2. Parcelable интерфейс требует больше времени для реализации по сравнению с Serializable интерфейсом
  3. Serializable интерфейс проще в реализации
  4. Serializable Интерфейс создает много временных объектов и вызывает немало мусора
  5. Parcelable массив может быть передан через Intent в Android
174 голосов
/ 24 июля 2010

Сериализуемый - это стандартный интерфейс Java.Вы просто помечаете класс Serializable, реализуя интерфейс, и Java автоматически сериализует его в определенных ситуациях.

Parcelable - это специальный интерфейс для Android, где вы сами реализуете сериализацию.Он был создан, чтобы быть намного более эффективным, чем Serializable, и обойти некоторые проблемы со стандартной сериализационной схемой Java.

Я считаю, что Binder и AIDL работают с объектами Parcelable.

Однако вы можете использовать Сериализуемые объекты в Intents.

37 голосов
/ 12 марта 2014

Если вы хотите быть хорошим гражданином, уделите дополнительное время реализации Parcelable, так как он будет работать в 10 раз быстрее и использовать меньше ресурсы.

Однако в большинстве случаев медлительность Serializable не будет заметно. Не стесняйтесь использовать его, но помните, что сериализация дорогая операция, поэтому держите ее на минимуме.

Если вы пытаетесь передать список с тысячами сериализованных объектов, Вполне возможно, что весь процесс займет больше секунды. Это может сделать переходы или поворот от портрета до пейзажа чувствовать себя очень вялый.

Источник к этому пункту: http://www.developerphil.com/parcelable-vs-serializable/

32 голосов
/ 01 мая 2018

Parcelable против Сериализуемый Я имею в виду эти два.

Сериализуемый, Простота

Что такое Сериализуемый?

Serializable - это стандартный интерфейс Java. Это не часть Android SDK. Его простота - это красота. Просто реализуя это Интерфейс вашего POJO будет готов к переходу с одного занятия на другой.

public class TestModel implements Serializable {

String name;

public TestModel(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}
  • Прелесть сериализуемого в том, что вам нужно реализовать интерфейс Serializable только для класса и его потомков. Это маркерный интерфейс, означающий, что нет никакого метода для реализации, Java просто сделает все возможное для его эффективной сериализации.

  • Проблема этого подхода заключается в том, что используется отражение, и это медленный процесс. Этот механизм также имеет тенденцию создавать много временных объектов и вызывать довольно много мусора.

Parcelable, Скорость

Что такое Parcelable?

Parcelable - это другой интерфейс. Несмотря на своего конкурента (Сериализуемый в если вы забыли), это часть Android SDK. Теперь, Parcelable был специально разработан таким образом, что нет отражения при используй это. Это потому, что мы действительно процесс сериализации.

public class TestModel implements Parcelable {


String name;

public TestModel(String name, String id) {
    this.name = name;
}

protected TestModel(Parcel in) {
    this.name = in.readString();


}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

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

@Override
public void writeToParcel(Parcel dest, int flags) {
    dest.writeString(this.name);

}

public static final Parcelable.Creator<TestModel> CREATOR = new Parcelable.Creator<TestModel>() {
    @Override
    public TestModel createFromParcel(Parcel source) {
        return new TestModel(source);
    }

    @Override
    public TestModel[] newArray(int size) {
        return new TestModel[size];
    }
};
}

Теперь, победитель

enter image description here

Результаты испытаний, проведенных Филиппом Брео, показывают, что Parcelable более чем в 10 раз быстрее, чем Serializable. Некоторые другие инженеры Google также поддерживают это заявление.

В соответствии с ними, Serializable подход по умолчанию медленнее, чем Parcelable. И здесь у нас есть соглашение между двумя сторонами! НО, несправедливо сравнивать эти два вообще! Потому что с Parcelable мы на самом деле пишем собственный код. Код, специально созданный для это одно POJO. Таким образом, мусор не создается, и результаты лучше. Но с подходом Serializable по умолчанию мы полагаемся на автоматический Процесс сериализации Java. Процесс явно не обычай в все и создает много мусора! Таким образом, худшие результаты.

Стоп Стоп !!!!, До принятия решения

Теперь есть другой подход . Весь автоматический процесс за Serializable может быть заменен пользовательским кодом, который использует writeObject () & методы readObject (). Эти методы специфичны. Если мы хотим положиться на подходе Serializable в сочетании с настраиваемой сериализацией поведение, то мы должны включить эти два метода с одинаковым подпись как ниже:

 private void writeObject(java.io.ObjectOutputStream out)
 throws IOException;

 private void readObject(java.io.ObjectInputStream in)
     throws IOException, ClassNotFoundException;

 private void readObjectNoData()
     throws ObjectStreamException;

И теперь сравнение между Parcelable и Custom Serializable кажется справедливым! Результаты могут быть удивительными! Настраиваемый Serializable подход более чем в 3 раза быстрее для записи и в 1,6 раза быстрее для чтения, чем Parcelable.

28 голосов
/ 01 февраля 2017

В Parcelable разработчики пишут собственный код для маршалинга и демаршалинга, поэтому он создает меньше мусорных объектов по сравнению с сериализацией.Благодаря этой пользовательской реализации производительность Parcelable over Serialization значительно улучшается (примерно в два раза быстрее).

Сериализация - это маркерный интерфейс, который подразумевает, что пользователь не может упорядочить данные в соответствии со своими требованиями.При сериализации операция маршалинга выполняется на виртуальной машине Java (JVM) с использованием API отражения Java.Это помогает идентифицировать элемент и поведение объекта Java, но также приводит к созданию большого количества мусорных объектов. В связи с этим процесс сериализации является медленным по сравнению с Parcelable.

Редактировать: Что означает маршаллинг и демаршаллинг?

ВВ нескольких словах «маршаллинг» относится к процессу преобразования данных или объектов в байтовый поток, а «демаршаллинг» - обратный процесс преобразования байтового потока в их исходные данные или объект.Преобразование достигается посредством «сериализации».

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

17 голосов
/ 25 марта 2015

Я на самом деле собираюсь быть тем парнем, который защищает Serializable.Разница в скорости уже не так существенна, поскольку устройства намного лучше, чем несколько лет назад, а также есть и другие, более тонкие различия.См. мой блог сообщение о проблеме для получения дополнительной информации.

11 голосов
/ 18 августа 2015

1. Сериализуемый

@ см http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Интерфейс чего?

  • - это стандартный интерфейс Java

Скорость

  • медленнее, чем Parcelable

2. Parcelable

@ см http://developer.android.com/reference/android/os/Parcelable.html

Интерфейс чего?

  • это интерфейс android.os
    • , что означает, что Google разработал Parcelable для лучшей производительности на Android

Скорость

  • быстрее (потому что он оптимизирован для использования на Android)

> В заключение

Помните, что Serializable - это стандартный интерфейс Java, а Parcelable - для разработки под Android

6 голосов
/ 31 декабря 2015

Существует некоторая проблема производительности, связанная с маршалингом и демаршалингом.Parcelable в два раза быстрее, чем Serializable.

Пожалуйста, перейдите по следующей ссылке:

http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development

4 голосов
/ 12 декабря 2018

Parcelable является своего рода стандартом в разработке Android. Но не из-за скорости

Parcelable рекомендуется для передачи данных. Но если вы правильно используете сериализуемый, как показано в этом репо , вы увидите, что сериализуемый иногда даже быстрее, чем подлежащий продаже. Или, по крайней мере, сроки сопоставимы.

Является ли Parcelable быстрее, чем Serializable?

Обычная сериализация Java на среднем устройстве Android (если все сделано правильно *) примерно в 3,6 раза быстрее, чем Parcelable для записи, и примерно в 1,6 раза быстрее для чтения. Также это доказывает, что Java Serialization (если все сделано правильно) является быстрым механизмом хранения, который дает приемлемые результаты даже при относительно больших графах объектов из 11000 объектов с 10 полями в каждом.

* Смысл в том, что обычно каждый, кто слепо заявляет, что «Parcelable намного быстрее», сравнивает его с автоматической сериализацией по умолчанию, которая использует много отражения внутри. Это несправедливое сравнение, потому что Parcelable использует ручную (и очень сложную) процедуру записи данных в поток. Что обычно не упоминается, так это то, что стандартную сериализацию Java в соответствии с документами также можно выполнить вручную, используя методы writeObject () и readObject (). Для получения дополнительной информации см. JavaDocs. Вот как это должно быть сделано для лучшей производительности.

Итак, если сериализуемый объект быстрее и проще в реализации, почему у Android вообще есть пакет?

Причина в нативном коде. Parcelable создан не только для межпроцессного взаимодействия. Он также может быть использован для межкодовой связи . Вы можете отправлять и получать объекты из собственного уровня C ++. Вот и все.

Что выбрать? Оба будут работать хорошо. Но я думаю, что Parcelable - лучший выбор, так как он рекомендован Google, и, как вы можете видеть из этой ветки, он ценится гораздо лучше.

4 голосов
/ 22 августа 2016

Реализация parcelable может быть быстрее, если вы используете плагин paracelable в Android Studio.поиск Android Генератор парсерального кода

...