Использование Serializable в Android плохо?
Я читал много сообщений и статей, превозносящих скорость Parcelable над Serializable. Я использую оба способа для передачи данных между действиями через намерения и еще не заметил разницы в скорости при переключении между ними. Типичный объем данных, который я должен передать, составляет от 5 до 15 вложенных объектов с 2 до 5 полей каждый.
поскольку у меня около 30 классов, которые должны быть переносимыми, реализация Parcelable требует много шаблонных код, который добавляет время обслуживания. Одно из моих текущих требований также заключается в том, что скомпилированный код должен быть как можно меньше; я ожидаю, что смогу сэкономить место, используя Serializable над Parcelable.
должен ли я использовать Parcelable или нет причин использовать его для сериализации для таких небольших объемов данных? Или есть еще одна причина, по которой я не должен использовать Serializable?
4 ответов
для использования в памяти Parcelable намного лучше, чем Serializable. Я настоятельно рекомендую не использовать Serializable.
вы не можете использовать Parcelable для данных, которые будут храниться на диске (потому что у него нет хороших гарантий о согласованности данных, когда все меняется), однако сериализуемый достаточно медленный, что я настоятельно рекомендую не использовать его там. Вам лучше самому записать данные.
кроме того, одна из проблем производительности с Serializable что он заканчивается вращением через множество временных объектов, вызывая много активности GC в вашем приложении. Это отвратительно. :}
продолжайте использовать сериализацию. Вы увидите много людей в интернете, которые скажут вам, что сериализация очень медленная и неэффективная. Это верно. Но одна вещь, которую вы никогда не хотите делать как компьютерный программист, - это принимать любые комментарии о производительности как абсолют.
спросите себя, замедляет ли сериализация вашу программу. Вы замечаете, когда она переходит от деятельности к деятельности? Вы замечаете, когда он сохраняет / загружает? Если нет, все в порядке. Вы не получите меньший след, когда вы переходите к большому количеству кода ручной сериализации, поэтому там нет никакого преимущества. Так что, если это в 100 раз медленнее, чем альтернатива, если в 100 раз медленнее означает 10 мс вместо 0,1 мс? Ты тоже не увидишь, так что какая разница? И зачем кому-то вкладывать огромные усилия в написание ручной сериализации для 30 классов, когда это не будет иметь заметной разницы в производительности?
все просто слепо утверждают, что Parcelable лучше и быстрее, чем Serializable, но никто не пытался поддержать его утверждения какими-либо доказательствами. Я решил проверить это сам и получил очень интересные результаты.
обычная сериализация Java на среднем устройстве Android (если все сделано правильно) примерно в 3,6 раза быстрее, чем Parcelable для записи и примерно в 1,6 раза быстрее для чтения.
вы можете проверить мой тестовый проект здесь: https://bitbucket.org/afrishman/androidserializationtest
кто-нибудь рассматривал сериализацию с использованием JSON и передачу данных в виде строки? GSON и Jackson должны быть достаточно эффективными, чтобы конкурировать с Parcelable, а также Сериализуемыми.