Android: Разница между Parcelable и Serializable?

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

Ответ 1

В 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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

Parcelable vs Serializable Я отношу эти два.

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

Что такое Serializable?

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 - это еще один интерфейс. Несмотря на свою конкуренцию (Serializable на случай, если вы забыли), это часть 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

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

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

Stop Stop !!!!, Прежде чем принимать решение

Теперь есть другой подход. Весь автоматический процесс 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 и пользовательским Serializable кажется справедливым! Результаты могут быть неожиданными! Пользовательский подход Serializable более чем в 3 раза быстрее для записи и на 1,6 раза быстрее для чтения, чем для Parcelable.

Ответ 5

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

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

Изменение: В чем смысл маршаллинга и разборки?

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

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

Ответ 6

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

Ответ 7

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

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

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

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

Speed ​​

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

2. Parcelable

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

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

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

Speed ​​

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

> Заключение

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

Ответ 8

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, и, как вы можете видеть из этой ветки, он более ценится.

Ответ 10

Реализация parcelable может быть более быстрой, если вы используете paracelable plugin в android studio. поиск для Android Parcelable code generator

Ответ 11

Интерфейс Serializable может использоваться так же, как и Parcelable, что приводит к (не намного) лучшим характеристикам. Просто перепишите эти два метода для обработки ручного сортировки и отмены процесса:

private void writeObject(java.io.ObjectOutputStream out)
    throws IOException
private void readObject(java.io.ObjectInputStream in)
    throws IOException, ClassNotFoundException

Тем не менее, мне кажется, что при разработке родного Android использование Android api - это путь.

Смотрите:

Ответ 12

вы можете использовать сериализуемые объекты в намерениях, но во время создания сериализации объекта Parcelable это может привести к серьезному исключению, например NotSerializableException. Не рекомендуется ли использовать сериализуемое соединение с Parcelable. Поэтому лучше расширять Parcelable с помощью объекта, который вы хотите использовать с пакетом и намерениями. Поскольку этот Parcelable является специфичным для Android, он не имеет побочных эффектов. :)

Ответ 13

Устанавливается гораздо быстрее, чем сериализуемое с помощью Binder, потому что сериализуемое использование отражает и вызывает много GC. Parcelable - это дизайн для оптимизации прохождения объекта.

Здесь ссылается на ссылку. http://www.developerphil.com/parcelable-vs-serializable/

Ответ 14

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

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

Parcelable

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