Parcelable vs Serializable
Apr 23, 2017 · 4 min read
Often, when we develop applications, we have to transfer data from one Activity to another. Of course, we can not do that directly. The data we want to transfer must be included into a corresponding Intent object. And if we want to move a complex POJO (e.x. Person, Car, Employee, etc.) we also need to perform some additional actions to make that object suitable for a transfer. To do that, our object must be either Serializable or Parcelable.
What is Serializable?
Serializable is a stan d ard Java interface. It is not a part of the Android SDK. It’s simplicity is it’s beauty. Just by implementing this interface your POJO will be ready to jump from one Activity to another. In the following code snippet you can see how simple it is to use this interface.
Because Serializable is a marker interface, we don’t have to implement tons of extra methods. When we ‘mark’ our POJO with it, Java will try it’s best to serialize it.
Of course, this simple approach has it’s price. Reflection is used during the process and lots of additional objects are created along the way. This can cause lot’s of garbage collection. The result is poor performance and battery drain.
What is Parcelable?
Parcelable is another interface. Despite it’s rival (Serializable in case you forgot), it is a part of the Android SDK. Now, Parcelable was specifically designed in such a way that there is no reflection when using it. That is because, we are being really explicit for the serialization process. In the code snippet down below you can see a sample usage of the Parcelable interface:
Of course, there is a price we have to pay when using Parcelable as well! Because of the boilerplate code, it is much harder to maintain and understand the POJO from above.
Parcelable VS Serializable
If you search through the web for info on this topic, you will most probably come to the conclusion that there won’t be an absolute winner for this comparison. There are people and articles out there, which support either the one, or the other approach. Thus, I will present you both sides and leave you to decide for yourself!
The first ‘team’ stands behind the idea that Parcelable is way faster and better than Serializable. Of course, there is data behind this statement.
The results from the tests conducted by Philippe Breault show that Parcelable is more than 10x faster than Serializable. Some other Google engineers stand behind this statement as well.
You can find a link to Philippe’s article in the ‘References’ section down below.
Now, the second ‘team’ claims that we are all doing it wrong! And their arguments sound reasonable enough!
According to them, the default Serializable approach is slower than Parcelable. And here we have an agreement between the two parties! BUT, it is unfair to compare these two at all! Because with Parcelable we are actually writing custom code. Code specifically created for that one POJO. Thus, no garbage is created and the results are better. But with the default Serializable approach, we rely on the automatic serialization process of Java. The process is apparently not custom at all and creates lots of garbage! Thus, the worse results.
Now, there is another approach. The whole automatic process behind Serializable can be replaced by custom code which uses writeObject() & readObject() methods. These methods are specific. If we want to rely on the Serializable approach in combination with custom serialization behavior, then we must include these two methods with the same exact signature as the one below:
Strange! Weird! Unusual! But that’s how it works! Now, in these two methods we can include our custom logic. If done correctly, the garbage associated with the default Serializable approach will not be a factor anymore!
And now a comparison between Parcelable and custom Serializable seems fair! The results may be surprising! The custom Serializable approach is more than 3x faster for writes and 1.6x faster for reads than Parcelable. You can find a BitBucket project with test data in the ‘Resources’ section to play with.
In my opinion, the differences in speed between the two approaches will be almost insignificant in most of the cases. Thus, at the end of the day, it is rather more important to get the job done and to have happy users, than to have an app running with 0.000042 milliseconds faster.
Источник
Android: разница между Parcelable и Serializable?
Почему Android предоставляет 2 интерфейса для сериализации объектов? Связаны ли объекты Serializable с файлами Android Binder и AIDL?
13 ответов
В Android мы не можем просто передавать объекты в действия. Для этого объекты должны реализовывать интерфейс Serializable или Parcelable .
Сериализуемый
Serializable — это стандартный интерфейс Java. Вы можете просто реализовать интерфейс Serializable и добавить методы переопределения. Проблема этого подхода заключается в том, что используется рефлексия, и это медленный процесс. Этот метод создает много временных объектов и вызывает довольно много мусора. Тем не менее, Serializable интерфейс проще в реализации.
Посмотрите на пример ниже (Сериализуемый):
Parcelable
Процесс Parcelable намного быстрее, чем Serializable . Одна из причин этого заключается в том, что мы явно рассказываем о процессе сериализации, а не используем отражение для его вывода. Также очевидно, что код был сильно оптимизирован для этой цели.
Посмотрите на пример ниже (Parcelable):
Вы можете передать ArrayList объектов Parcelable, как показано ниже:
Заключение
- Parcelable быстрее, чем Serializable интерфейс
- Интерфейс Parcelable требует больше времени для реализации по сравнению с интерфейсом Serializable
- Serializable интерфейс проще в реализации
- Serializable интерфейс создает много временных объектов и вызывает немало мусора
- Parcelable массив может быть передан через Intent в Android
Serializable — это стандартный интерфейс Java. Вы просто отмечаете класс Serializable, реализуя интерфейс, и Java будет автоматически сериализовать его в определенных ситуациях.
Parcelable — это особый интерфейс для Android, где вы сами реализуете сериализацию. Он был создан гораздо эффективнее, чем Serializable, и чтобы обойти некоторые проблемы со схемой сериализации Java по умолчанию.
Я считаю, что Binder и AIDL работают с объектами Parcelable.
Однако вы можете использовать объекты Serializable в Intents.
Если вы хотите быть хорошим гражданином, возьмите дополнительное время для реализации Исходно, поскольку он будет работать в 10 раз быстрее и использовать меньше ресурсы.
Однако в большинстве случаев медленность Serializable не будет заметно. Не стесняйтесь использовать его, но помните, что сериализация это дорогостоящая операция, поэтому сохраните ее до минимума.
Если вы пытаетесь передать список тысячами сериализованных объектов, возможно, что весь процесс займет больше секунды. Это может сделать переходы или поворот от портрета к lanscape чувствовать себя очень вялым.
В Parcelable разработчики пишут собственный код для маршалинга и размаширования, поэтому он создает меньше мусорных объектов по сравнению с сериализацией. Из-за этой пользовательской реализации производительность Parcelable over Serialization значительно улучшается (примерно в два раза быстрее).
Сериализация — это интерфейс маркера, который подразумевает, что пользователь не может маршировать данные в соответствии с их требованиями. В Сериализации операция маршалинга выполняется на виртуальной машине Java (JVM) с использованием API отражения Java. Это помогает идентифицировать элемент и поведение объекта Java, но также создает много объектов для мусора. В связи с этим процесс сериализации медленный по сравнению с Parcelable.
Изменение: В чем смысл маршаллинга и разборки?
В нескольких словах «маршаллинг» относится к процессу преобразования данных или объектов в байтовый поток, а «unmarshalling» — это обратный процесс преобразования байтового потока в исходные данные или объект. Преобразование осуществляется посредством «сериализации».
Сериализуемый, простота
Что такое Serializable?
Serializable — это стандартный интерфейс Java. Он не является частью Android SDK. Его простота — его красота. Просто реализуя этот интерфейс, ваш POJO будет готов перейти от одного действия к другому.
Красота сериализуемого заключается в том, что вам нужно только реализовать интерфейс Serializable для класса и его дочерних элементов. Это интерфейс-маркер, а это означает, что нет никакого способа реализовать, Java просто сделает все возможное для его сериализации.
Проблема с этим подходом заключается в том, что используется отражение, и это медленный процесс. Этот механизм также имеет тенденцию создавать много временных объектов и вызывать немало сбора мусора.
Исправлено, скорость
Что является возможным?
Parcelable — это еще один интерфейс. Несмотря на свою конкуренцию (Serializable на случай, если вы забыли), это часть Android SDK. Теперь Parcelable был специально разработан таким образом, что при его использовании нет никакого отражения. Это потому, что мы действительно являемся явным для процесса сериализации.
Теперь победитель
Результаты тестов, проведенных Philippe Breault, показывают, что Parcelable более чем в 10 раз быстрее, чем Serializable. За этим утверждением стоят и другие инженеры Google.
По их словам, стандартный метод Serializable медленнее, чем Parcelable. И здесь у нас есть соглашение между двумя сторонами! НО, несправедливо сравнивать эти два! Потому что с Parcelable мы на самом деле пишем собственный код. Код, специально созданный для этого POJO. Таким образом, никакой мусор не создается, и результаты лучше. Но с использованием стандартного подхода Serializable мы полагаемся на процесс автоматической сериализации Java. Этот процесс, по-видимому, не является обычным явлением и создает много мусора! Таким образом, худшие результаты.
Stop Stop . Прежде чем принимать решение
Теперь есть другой подход. Весь автоматический процесс Serializable можно заменить специальным кодом, который использует методы writeObject() и readObject(). Эти методы специфичны. Если мы хотим полагаться на подход Serializable в сочетании с пользовательским поведением сериализации, тогда мы должны включить эти два метода с той же точной подписями, что и ниже:
И теперь сравнение между Parcelable и пользовательским Serializable кажется справедливым! Результаты могут быть неожиданными! Пользовательский подход Serializable более чем в 3 раза быстрее для записи и на 1,6 раза быстрее для чтения, чем для Parcelable.
Источник
Serializable vs Parcelable in Android
Apr 25, 2020 · 3 min read
In this blog, we are going to discuss what is Serializable and Parcelable, and when we use this concept and why.
While developing android applications, we often used to transfer the data from one activity to another. When we have data like boolean values, int values, String values we can pass these data very easily through intent. For example:-
But In some cases, we have to pass comp l ex POJO class objects (e.x. Student, Employee, Vehicle etc.) to another activity. In this scenario, we have to do some extra stuff with the POJO class that makes object to be easily transferrable from one activity to another.
We can achieve this by using two concepts which are Serializable and Parcelable.
Let’s look into it.
Serializable is a standard Java interface which belongs to java.io.Serializable. It is not part of the Android SDK. It is easy to use due to its simplicity. We have to simply implement it with the POJO class. Here is an example:-
Now, we are ready to go. To pass these objects, we have to code like this:-
Parcelable is also an interface that belongs to android.os.Parcelable. It is part of the Android SDK. It converts the object into a byte stream and passes the data between activities. To implement this with POJO class we have to override some methods and write Creators method. Here is an example:-
We can pass Parcelable objects like this:-
Difference between Serializable and Parcelable
- Serializable is a slow process whereas Parcelable is fast.
- Parcelable interface takes more time to implement in comparison to Serializable.
- Serializable creates lots of temporary objects in comparison to Parcelable.
- Serializable is not reflection safe whereas Parcelable is reflection safe.
Источник
Android: Разница между Parcelable и Serializable?
Почему Android предоставляет 2 интерфейса для сериализации объектов? Связаны ли объекты Serializable с файлами Android Binder и AIDL?
ОТВЕТЫ
Ответ 1
В Android мы не можем просто передавать объекты в действия. Для этого объекты должны реализовывать интерфейс Serializable или Parcelable .
Сериализуемый
Serializable — это стандартный интерфейс Java. Вы можете просто реализовать интерфейс Serializable и добавить методы переопределения. Проблема этого подхода заключается в том, что используется рефлексия, и это медленный процесс. Этот метод создает много временных объектов и вызывает довольно много мусора. Тем не менее, Serializable интерфейс проще в реализации.
Посмотрите на пример ниже (Сериализуемый):
Parcelable
Процесс Parcelable намного быстрее, чем Serializable . Одна из причин этого заключается в том, что мы явно рассказываем о процессе сериализации, а не используем отражение для его вывода. Также очевидно, что код был сильно оптимизирован для этой цели.
Посмотрите на пример ниже (Parcelable):
Вы можете передать ArrayList объектов Parcelable, как показано ниже:
Заключение
- Parcelable быстрее, чем Serializable интерфейс
- Интерфейс Parcelable требует больше времени для реализации по сравнению с интерфейсом Serializable
- Serializable интерфейс проще в реализации
- Serializable интерфейс создает много временных объектов и вызывает немало мусора
- Parcelable массив может быть передан через Intent в Android
Ответ 2
Serializable — это стандартный интерфейс Java. Вы просто отмечаете класс Serializable, реализуя интерфейс, и Java будет автоматически сериализовать его в определенных ситуациях.
Parcelable — это особый интерфейс для Android, где вы сами реализуете сериализацию. Он был создан гораздо эффективнее, чем Serializable, и чтобы обойти некоторые проблемы со схемой сериализации Java по умолчанию.
Я считаю, что Binder и AIDL работают с объектами Parcelable.
Однако вы можете использовать объекты Serializable в Intents.
Ответ 3
Если вы хотите быть хорошим гражданином, возьмите дополнительное время для реализации Исходно, поскольку он будет работать в 10 раз быстрее и использовать меньше ресурсы.
Однако в большинстве случаев медленность Serializable не будет заметно. Не стесняйтесь использовать его, но помните, что сериализация это дорогостоящая операция, поэтому сохраните ее до минимума.
Если вы пытаетесь передать список тысячами сериализованных объектов, возможно, что весь процесс займет больше секунды. Это может сделать переходы или поворот от портрета к lanscape чувствовать себя очень вялым.
Ответ 4
Сериализуемый, простота
Что такое Serializable?
Serializable — это стандартный интерфейс Java. Он не является частью Android SDK. Его простота — его красота. Просто реализуя этот интерфейс, ваш POJO будет готов перейти от одного действия к другому.
Красота сериализуемого заключается в том, что вам нужно только реализовать интерфейс Serializable для класса и его дочерних элементов. Это интерфейс-маркер, а это означает, что нет никакого способа реализовать, Java просто сделает все возможное для его сериализации.
Проблема с этим подходом заключается в том, что используется отражение, и это медленный процесс. Этот механизм также имеет тенденцию создавать много временных объектов и вызывать немало сбора мусора.
Исправлено, скорость
Что является возможным?
Parcelable — это еще один интерфейс. Несмотря на свою конкуренцию (Serializable на случай, если вы забыли), это часть Android SDK. Теперь Parcelable был специально разработан таким образом, что при его использовании нет никакого отражения. Это потому, что мы действительно являемся явным для процесса сериализации.
Теперь победитель
Результаты тестов, проведенных Philippe Breault, показывают, что Parcelable более чем в 10 раз быстрее, чем Serializable. За этим утверждением стоят и другие инженеры Google.
По их словам, стандартный метод Serializable медленнее, чем Parcelable. И здесь у нас есть соглашение между двумя сторонами! НО, несправедливо сравнивать эти два! Потому что с Parcelable мы на самом деле пишем собственный код. Код, специально созданный для этого POJO. Таким образом, никакой мусор не создается, и результаты лучше. Но с использованием стандартного подхода Serializable мы полагаемся на процесс автоматической сериализации Java. Этот процесс, по-видимому, не является обычным явлением и создает много мусора! Таким образом, худшие результаты.
Stop Stop . Прежде чем принимать решение
Теперь есть другой подход. Весь автоматический процесс Serializable можно заменить специальным кодом, который использует методы writeObject() и readObject(). Эти методы специфичны. Если мы хотим полагаться на подход Serializable в сочетании с пользовательским поведением сериализации, тогда мы должны включить эти два метода с той же точной подписями, что и ниже:
И теперь сравнение между Parcelable и пользовательским Serializable кажется справедливым! Результаты могут быть неожиданными! Пользовательский подход Serializable более чем в 3 раза быстрее для записи и на 1,6 раза быстрее для чтения, чем для Parcelable.
Ответ 5
В Parcelable разработчики пишут собственный код для маршалинга и размаширования, поэтому он создает меньше мусорных объектов по сравнению с сериализацией. Из-за этой пользовательской реализации производительность Parcelable over Serialization значительно улучшается (примерно в два раза быстрее).
Сериализация — это интерфейс маркера, который подразумевает, что пользователь не может маршировать данные в соответствии с их требованиями. В Сериализации операция маршалинга выполняется на виртуальной машине Java (JVM) с использованием API отражения Java. Это помогает идентифицировать элемент и поведение объекта Java, но также создает много объектов для мусора. В связи с этим процесс сериализации медленный по сравнению с Parcelable.
Изменение: В чем смысл маршаллинга и разборки?
В нескольких словах «маршаллинг» относится к процессу преобразования данных или объектов в байтовый поток, а «unmarshalling» — это обратный процесс преобразования байтового потока в исходные данные или объект. Преобразование осуществляется посредством «сериализации».
Ответ 6
Я на самом деле собираюсь быть тем парнем, который защищает Serializable. Разница в скорости уже не так существенна, поскольку устройства намного лучше, чем несколько лет назад, а также есть и другие, более тонкие различия. Подробнее читайте в моем блоге о проблеме.
Источник