Почему Android предоставляет 2 интерфейса для сериализации объектов? Сериализуемые объекты взаимодействуют с файлами Android Binder
и AIDL?
источник
Почему Android предоставляет 2 интерфейса для сериализации объектов? Сериализуемые объекты взаимодействуют с файлами Android Binder
и AIDL?
В 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");
Вывод
Parcelable
быстрее Serializable
интерфейсаParcelable
Интерфейс требует больше времени для реализации по сравнению с Serializable
интерфейсомSerializable
интерфейс проще в реализации Serializable
Интерфейс создает много временных объектов и вызывает немало мусораParcelable
массив может быть передан через Intent в Android
Serializable - это стандартный интерфейс Java. Вы просто помечаете класс Serializable, реализуя интерфейс, и Java автоматически сериализует его в определенных ситуациях.
Parcelable - это специальный интерфейс для Android, где вы сами реализуете сериализацию. Он был создан, чтобы быть намного более эффективным, чем Serializable, и обойти некоторые проблемы со стандартной сериализационной схемой Java.
Я считаю, что Binder и AIDL работают с объектами Parcelable.
Однако вы можете использовать Сериализуемые объекты в Intents.
источник
Parcelable vs Serializable Я называю эти два.
Для Явы и Котлина
1) Ява
Сериализуемый, Простота
Прелесть serializable заключается в том, что вам нужно реализовать интерфейс Serializable только для класса и его потомков. Это маркерный интерфейс, означающий, что метод для реализации не существует, Java просто сделает все возможное для его эффективной сериализации.
Проблема этого подхода заключается в том, что используется рефлексия, и это медленный процесс. Этот механизм также имеет тенденцию создавать много временных объектов и вызывать довольно много мусора.
Parcelable, Скорость
Теперь победитель
Результаты тестов, проведенных Филиппом Брео, показывают, что Parcelable более чем в 10 раз быстрее, чем Serializable. Некоторые другие инженеры Google также поддерживают это заявление.
Стоп Стоп !!!!, прежде чем принимать решение
И теперь сравнение между Parcelable и Custom Serializable кажется справедливым! Результаты могут быть удивительными! Настраиваемый Serializable подход более чем в 3 раза быстрее для записи и в 1,6 раза быстрее для чтения, чем Parcelable.
Отредактировано: -----
2) Сериализация Kotlinx
Kotlinx Сериализация библиотека
Ваш
build.gradle
файлСериализация выполняется довольно легко, вам нужно пометить намеченный класс
@Serializable
аннотацией, как показано нижеЕще две аннотации, чтобы отметить
transient
иoptional
. Использование переходного процесса заставит сериализатор игнорировать это поле, а использование необязательного позволит сериализатору не разрываться, если поле отсутствует, но в то же время необходимо будет указать значение по умолчанию.Примечание : это может также работать с классами данных.
Для более
источник
Serialization
, посмотрите.Источник к этому пункту: http://www.developerphil.com/parcelable-vs-serializable/
источник
В Parcelable разработчики пишут собственный код для маршалинга и демаршалинга, поэтому он создает меньше мусорных объектов по сравнению с сериализацией. Благодаря этой пользовательской реализации производительность Parcelable по сравнению с сериализацией значительно улучшается (примерно в два раза быстрее).
Serializable - это маркерный интерфейс, который подразумевает, что пользователь не может упорядочить данные в соответствии со своими требованиями. При сериализации операция маршалинга выполняется на виртуальной машине Java (JVM) с использованием API отражения Java. Это помогает идентифицировать элемент и поведение объекта Java, но также приводит к созданию большого количества мусорных объектов. Из-за этого процесс сериализации идет медленно по сравнению с Parcelable.
Редактировать: Что означает маршаллинг и демаршаллинг?
В нескольких словах, «маршаллинг» относится к процессу преобразования данных или объектов в байтовый поток, а «демаршаллинг» - это обратный процесс преобразования байтового потока в их исходные данные или объект. Преобразование достигается через «сериализацию».
http://www.jguru.com/faq/view.jsp?EID=560072
источник
Я на самом деле собираюсь быть тем парнем, который защищает Serializable. Разница в скорости уже не так существенна, поскольку устройства намного лучше, чем несколько лет назад, а также есть и другие, более тонкие различия. Смотрите мой блог на вопрос для получения дополнительной информации.
источник
Parcelable является своего рода стандартом в разработке Android. Но не из-за скорости
Parcelable рекомендуется для передачи данных. Но если вы правильно используете serializable, как показано в этом репозитории , вы увидите, что сериализуемый иногда даже быстрее, чем parcelable. Или, по крайней мере, сроки сопоставимы.
Parcelable быстрее, чем Serializable?
Итак, если сериализуемый процесс быстрее и проще в реализации, почему у Android вообще есть пакет?
Причина в нативном коде. Parcelable создан не только для межпроцессного взаимодействия. Он также может быть использован для связи между кодами . Вы можете отправлять и получать объекты из собственного уровня C ++. Вот и все.
Что выбрать? Оба будут хорошо работать. Но я думаю, что Parcelable - лучший выбор, так как он рекомендован Google, и, как вы можете видеть из этой ветки, он более ценится.
источник
1. Сериализуемый
@see http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html
Интерфейс чего?
скорость
2. Parcelable
@see http://developer.android.com/reference/android/os/Parcelable.html
Интерфейс чего?
скорость
> В заключение
Помните, что Serializable - это стандартный интерфейс Java, а Parcelable - для разработки под Android.
источник
Существует некоторая проблема производительности, связанная с маршалингом и демаршалингом. Parcelable в два раза быстрее, чем Serializable.
Пожалуйста, перейдите по следующей ссылке:
http://www.3pillarglobal.com/insights/parcelable-vs-java-serialization-in-android-app-development
источник
Реализация parcelable может быть быстрее, если вы используете плагин paracelable в Android Studio. поиск Android Генератор парсерабельного кода
источник
Интерфейс Serializable можно использовать так же, как интерфейс Parcelable, что приводит к (не очень) лучшему быстродействию. Просто перезапишите эти два метода для ручного процесса маршалинга и демаршаллинга:
Тем не менее, мне кажется, что при разработке нативного Android использование Android API - это путь.
Видеть :
источник
Я опаздываю с ответом, но пишу с надеждой, что это поможет другим.
С точки зрения скорости ,
Parcelable > Serializable
. Но Custom Serializable является исключением. Это почти в диапазоне Parcelable или даже быстрее.Ссылка: https://www.geeksforgeeks.org/customized-serialization-and-deserialization-in-java/
Пример :
Пользовательский класс для сериализации
источник
Разборчиво гораздо быстрее, чем сериализуемое с помощью Binder, потому что сериализуемое использование отражения и вызывает много GC. Parcelable - это дизайн для оптимизации передачи объекта.
Вот ссылка на ссылку. http://www.developerphil.com/parcelable-vs-serializable/
источник
вы можете использовать сериализуемые объекты в намерениях, но во время сериализации объекта Parcelable это может привести к серьезному исключению, например NotSerializableException. Разве не рекомендуется использовать сериализуемый с Parcelable. Поэтому лучше расширить Parcelable объектом, который вы хотите использовать с помощью связки и намерений. Поскольку этот Parcelable специфичен для Android, у него нет побочных эффектов. :)
источник
Сериализуемый
Serializable - это маркируемый интерфейс, или мы можем назвать его пустым интерфейсом. У него нет предварительно реализованных методов. Serializable собирается преобразовать объект в поток байтов. Таким образом, пользователь может передавать данные между одним действием другому. Основное преимущество сериализуемого заключается в том, что создание и передача данных очень просты, но это медленный процесс по сравнению с возможностью их рассылки.
Parcelable
Посылка способна быстрее, чем сериализуемая. Parcel способен конвертировать объект в поток байтов и передавать данные между двумя действиями. Написание кода для посылок немного сложнее по сравнению с сериализацией. Он не создает больше временных объектов при передаче данных между двумя действиями.
источник