в чем разница между Parcelable и Serialization, используемыми в Android

Я хочу знать точно,

  1. следует ли мне использовать parcelable или serialization технику для отправки данных от одного действия другому?
  2. обязательно ли использовать один из них для отправки данных от одного к другому?
  3. когда мне их использовать?
  4. и точная разница между ними и их производительность в аспектах java.

Заранее спасибо.


 public class GetSetClass implements Serializable {
    private int dt = 10;

    /** pass any object, drwabale */
    public int getDt() {
        return dt;
    }

    public void setDt(int dt) {
        this.dt = dt;
    }
}

person SRam    schedule 18.06.2012    source источник
comment
Вы прошли через это - stackoverflow.com/ questions / 3323074 / и stackoverflow.com/questions/5550670/?   -  person verisimilitude    schedule 18.06.2012
comment
Используйте заглавные буквы для начала имени класса (GetSetClass или Getsetclass).   -  person keyser    schedule 18.06.2012
comment
Зачем нужна сериализация объектов в Android? можем ли мы не выполнить задачу без сериализации объектов?   -  person SRam    schedule 18.06.2012


Ответы (5)


должен ли я использовать метод посылки или сериализации для отправки данных от одного действия к другому.

Если вы отправляете данные / объект непримитивного типа другому действию через intent, вы должны либо Serialize, либо реализовать Parcelable для этого объекта. Предпочтительный метод - Parcelable, поскольку он не влияет на производительность.

обязательно ли использовать один из них для отправки данных от одного к другому. / когда мне их использовать.

Он только обязателен / используется для отправки объектов данных непримитивного типа.

и точная разница между ними и их производительность в аспектах java.

Сериализация действительно влияет на производительность. Для получения дополнительных сведений перейдите по этой ссылке Android Parcelable and Serializable

person Arun George    schedule 18.06.2012
comment
@hi arun George, .. почему я должен использовать сериализацию только для непримитивных типов данных? и почему это обязательно только для непримитивных типов данных? - person SRam; 18.06.2012
comment
Примитивные типы данных могут передаваться из одного действия в другое с помощью intent.putExtras(String id, PRIMITIVE_DATA_TYPE) и доступны в другом другом действии с помощью эквивалента getMethod () для этого типа. Но это не относится к типам данных, определяемым пользователем, и поэтому вы должны использовать либо serialization, либо Parcelable. - person Arun George; 18.06.2012
comment
хорошо, спасибо за ответ еще на один вопрос .. когда мы должны использовать Bundle для отправки данных и зачем помещать объект в Bundle intent.putExtras (String id, PRIMITIVE_DATA_TYPE), если мы используем сериализацию для отправки данных .. - person SRam; 18.06.2012

Эти концепции связаны с межпроцессным взаимодействием (IPC).

При отправке данных между двумя приложениями мы должны убедиться, что оба приложения должны понимать формат отправляемых данных.

Особенно, когда вы отправляете значения непримитивного типа данных, такие как классы и объекты, между двумя приложениями, мы должны преобразовать их в понятный для операционной системы формат. O.S понимает только примитивные типы (целые числа, символы и т. Д.). Причина преобразования заключается в том, что мы должны использовать канал связи O.S для передачи данных.

Этот процесс преобразования непримитивных типов в примитивы и отправки в другое приложение по некоторому каналу связи называется сериализацией. Обратный процесс называется де-сериализацией.

В Java IPC сильно зависит от сериализации Serializables. Но сериализация разработана с учетом настольных приложений. Когда вы выполняете IPC в мобильных приложениях, мы должны убедиться, что процесс IPC не будет слишком тяжелым.

Проще говоря, сериализация - тяжелая концепция для IPC. Поэтому вместо сериализации Android выбрал Binder для облегчения взаимодействия между процессами. Связующее внутри сильно зависит от посылок, чтобы сделать IPC. Посылки - это легкие сериализуемые объекты. Предпочтительно использовать участки для маршалинга объектов в байтовые потоки.

Примечание: Binder IPC сильно зависит от концепции общей памяти, чтобы гарантировать, что при совместном использовании между приложениями не происходит большого дублирования данных.

person user1923551    schedule 04.12.2013
comment
Я понятия не имею, почему этот ответ до сих пор не получил голосов, он довольно полный и, честно говоря, один из лучших для меня. - person GoRoS; 16.04.2014
comment
@vsvankhede Что ж, кажется, для всего есть свое время и место, и в настоящее время он является наиболее популярным. - person GoRoS; 30.10.2015

Получил очень хорошее объяснение разницы между Parcelable и Serialization.

Начнем с вашего вопроса, хотя он был давно, он может помочь другим:

  1. следует ли мне использовать метод рассылки или сериализации для отправки данных от одного действия другому?

Ответ: Parcelable - лучший выбор (почему будет объяснено позже).

  1. обязательно ли использовать один из них для отправки данных от одного к другому?

Ответ: Да, поскольку отправка данных (объекта) от одного к другому требует, чтобы потоки байтов были записаны и извлечены, и это можно сделать либо с помощью parcelable, либо с помощью сериализации.

  1. когда мне их использовать?

Ответ: На эту часть вы уже ответили, т. Е. Передачу данных из одного действия в другое.

  1. и точная разница между ними и их производительность в аспектах java.

Ответ: 1. Parcelable хорошо документирован в Android SDK; С другой стороны, сериализация доступна в Java.

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

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

Ответ взят из: по этой ссылке

См. Также: объяснение сериализации

person Bette Devine    schedule 19.06.2015

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

Androids Parcelable: - Файл межпроцессного взаимодействия Android (AIPC), чтобы сообщить Android, как следует маршалировать и демаршалировать ваш объект. Он менее общий и не использует отражение, поэтому он должен иметь гораздо меньше накладных расходов и быть намного быстрее.

Подробнее читайте на странице http://www.3pillarglobal.com/blog/parcelable-vs-java-serialization-android-app-development

person Sridhar Nalam    schedule 04.12.2013
comment
Выделение проблемы с сериализацией дает этот ответ: мой +1 - person Richard Le Mesurier; 02.12.2015

парцеллинг и сериализация - это способы маршалинга и демаршалинга данных. в Android это используется для передачи непримитивных типов данных между компонентами и процессами. В общем, Android позволяет сериализуемые или разделяемые объекты, поэтому вы можете выбрать свой метод. исключение составляют интерфейсы AIDL. объекты должны быть отправлены / возвращены.

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

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

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

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

person Jeffrey Blattman    schedule 01.08.2013