Подтвердить что ты не робот

Является ли использование Serializable в Android плохим?

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

Почему все рассматривают возможность сравнения Parcel с собственной сериализацией Java и забывают о том, что в мире Java существует много других методов сериализации, таких как Kyro и другие...?

Кроме того, важен случай использования. Странно, что еще не видел этого формального сравнения.