Использование Serializable в Android плохо? - PullRequest
53 голосов
/ 31 августа 2010

Я читал много постов и статей, восхваляющих скорость Parcelable по сравнению с Serializable.Некоторое время я использовал оба для передачи данных между Деятельностями через Intents, и пока не заметил какой-либо разницы в скорости при переключении между ними.Типичный объем данных, которые мне нужно передать, составляет от 5 до 15 вложенных объектов с 2-5 полями в каждом.

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

Должен ли я использовать Parcelable или нет никакой причины использовать его поверх Serializable для таких небольших объемов данных?Или есть другая причина, почему я не должен использовать Serializable?

Ответы [ 4 ]

64 голосов
/ 31 августа 2010

Для использования в памяти Parcelable намного, намного лучше, чем Serializable. Я настоятельно рекомендую не использовать Serializable.

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

Кроме того, одна из проблем с производительностью Serializable заключается в том, что он перестает вращаться через множество временных объектов, вызывая большую активность GC в вашем приложении. Это довольно отвратительно. :}

52 голосов
/ 03 февраля 2013

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

Спросите себя, не замедляет ли сериализация вашу программу. Вы замечаете, когда это переходит от деятельности к деятельности? Вы замечаете, когда он сохраняет / загружает? Если нет, то все в порядке. Вы не получите меньше места, когда перейдете к большому количеству кода ручной сериализации, поэтому здесь нет никаких преимуществ. Так что, если он в 100 раз медленнее, чем альтернатива, если в 100 раз медленнее, значит, 10 мс вместо 0,1 мс? Вы тоже не увидите, так кого это волнует? И зачем кому-то вкладывать огромные усилия в написание ручной сериализации для 30 классов, если это не окажет заметного влияния на производительность?

15 голосов
/ 29 марта 2015

Все просто слепо заявляют, что Parcelable лучше и быстрее, чем Serializable, но никто не пытался подкрепить его утверждения какими-либо доказательствами. Я решил проверить это сам и получил очень интересные результаты.

Обычная сериализация Java на среднем устройстве Android (если все сделано правильно) примерно в 3,6 раза быстрее, чем Parcelable для записи, и примерно в 1,6 раза быстрее для чтения.

Вы можете проверить мой тестовый проект здесь: https://bitbucket.org/afrishman/androidserializationtest

0 голосов
/ 03 июня 2015

Кто-нибудь рассматривал сериализацию с использованием JSON и передачу данных в виде строки? GSON и Джексон должны быть достаточно эффективными, чтобы быть конкурентом Parcelable, а также Serializable.

...