Использование Сериализуемого в Android плохо?


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

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

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

4   51  

4 ответа:

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

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

кроме того, одна из проблем производительности с Сериализуемым является что он заканчивается вращением через множество временных объектов, вызывая много активности 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, а также Сериализуемым.