Всегда ли сериализуемый объект сериализуется при помещении в пакет? - PullRequest
6 голосов
/ 24 августа 2010

Нам было интересно, когда при использовании Bundle с сериализуемыми или пакетируемыми объектами, когда в действительности происходит сортировка?Как только вы положите его в комплект?Поскольку пакеты в основном используются для простой передачи данных между двумя экранами (здесь мы даже не говорим об IPC!), Похоже, нет особого смысла в маршалинге объекта, так как он постоянно находится в памяти, нет?

Правильно ли мы предполагаем, что сортировка (будь то Java-сериализация или Android-парцеллинг) происходит, только если

  1. данные должны быть переданы другому процессу, например, во время RMI или
  2. компонент (действие или служба) разрушается, а состояние экземпляра должно быть записано на диск?

Я видел, как инженеры по разработке фреймворков Android (я думаю, это была Дайан Хэкборн) говорят, что одинследует использовать Parcelable вместо Serializable, потому что первый намного быстрее.Насколько быстрее?И будет ли это вообще иметь значение, если объект все равно не будет составлен в большинстве случаев (если предположить, что наши предположения были верны)?

Ответы [ 2 ]

6 голосов
/ 25 августа 2010

Я думаю, я понял это. Я потратил весь последний день и большую часть сегодняшнего дня на отладку исходного кода Android Parcel и Bundle, и вот как это работает:

  • a Bundle - это просто обертка вокруг HashMap, но он поддерживает разбор (то есть маршал) этой внутренней карты и ее содержимого
  • если вы поместите значение в Bundle, он сначала разархивирует эту внутреннюю карту, а затем просто поместит значение в эту карту
  • разбор карты происходит лениво: она будет разархивирована, только если вы пытаетесь получить к ней доступ (например, вызвав bundle.putParcelable ()). Даже в этом случае он будет только разархивировать саму карту, но не ее значения. Только когда вы попытаетесь получить доступ к этим значениям (например, с помощью bundle.getParcelable ("key")), оно также будет отменено. Другими словами, если вы отправляете что-то, находящееся внутри Пакета, разбор не произойдет, если вы никогда не получите доступ к этим значениям снова.

Итак, обычно: NO , значение не разделяется просто путем помещения его в Bundle. Вместо этого происходит разделение при передаче Пакета другому компоненту (операции или службе; почему Android это не делает, я не знаю, поскольку технически не происходит IPC.) Или когда его нужно отделить другим способом.

0 голосов
/ 24 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...