تفاوت Serializable و Parcelable

اگر کمی اندروید دولوپ کرده باشید، احتمالا این اسم‌ها برایتان آشنا هستند. در این مقاله کمی درباره این دو اینترفیس به ظاهر مشابه صحبت و تفاوت‌های آن‌ها را بررسی می‌کنیم.

تشابه‌ها

هر دو این اینترفیس‌ها برای خواندن و نوشتن اطلاعات روی دیسک استفاده می‌شوند و به عبارت دیگر مکانیزم ذخیره و بازیابی آبجکت‌ها روی حافظه هستند.


در ادامه بیشتر درباره هریک و جزئیاتشان بحث می کنیم.


Serializable

یک اینترفیس خالی بدون هیچ متدی است و در واقع یک Marker Interface است.

برای استفاده از این قابلیت جاوا تنها کاری که لازم است انجام دهیم آن است که کلاس موردنظر Serializable را ایمپلمنت کند.

کلاسی که این اینترفیس را ایمپلمنت می‌کند، از این نوع Serializable خواهد شد و می تواند سریال یا دیسریال شود.

در کلاس Person می‌بینیم که این کلاس Serialize را ایمپلمنت کرده است:

https://gist.github.com/nasrabadiAM/9783cdea0ac44a01b527d8ec02916d39

و به صورت زیر آبجکت‌هایی از Person را ذخیره و بازیابی می‌کنیم:

https://gist.github.com/nasrabadiAM/aeef81257afb98a20fbb0fe2c2442a43


Parcelable

این اینترفیس فقط یک Marker Interface نیست و استفاده از ان هم به راحتی استفاده از Serializable نیست. Parcelable از پکیج‌های اندروید است و به صورت تخصصی برای خواندن و نوشتن اطلاعات نوشته شده است.
برای آنکه یک کلاس Parcelable شود، علاوه بر آنکه اینترفیس Parcelable را ایمپلمنت می‌کند باید مقداری کد اضافه‌تر هم داشته باشد.

یک کلاس ساده که از این اینترفیس استفاده می‌کند، به صورت زیر است:

https://gist.github.com/nasrabadiAM/7d4321b9b4ce0b2ab49d13bc92d7a056

و برای استفاده از آن به صورت زیر عمل می‌کنیم:

https://gist.github.com/nasrabadiAM/e37fffc8a08ad9df5081fa39b66b8602




تفاوت‌ها

  • اولین و ساده‌ترین تفاوت آن است که Parcelable جزئی از کلاس‌های اندروید (android.os.Parcelable) است ولی Serializable از جاوا (java.io.Serializable).


  • تفاوت بعدی در سرعت و پرفورمنس این دو است، Serializable جاوا از رفلکشن استفاده می‌کند، برای همین سرعت بسیار پایین‌تری نسبت به Parcelable دارد. همچنین Serializable جاوا تعداد زیادی آبجکت‌های موقتی تولید می‌کند که کمی برروی garbage collectionجاوا تاثیرگذار است و کار آن را بیشتر میکند. اما Parcelable بسیار سریعتر است و یکی از دلایل اصلی این پرفورمنس به استفاده نکردن از رفلکشن برمی‌گردد. و البته این‌که Parcelable به خوبی برای این کار بهینه شده است. برای آنکه یک مقیاس از این پرفورمنس داشته باشید، به دیاگرام زیر توجه کنید:


  • تفاوت بعدی در سادگی استفاده از Serializable نسبت به Parcelable است که نمونه کدهای آن‌ها را در ابتدای همین مقاله دیدیم.

این که از هرکدام از این دو در چه مواردی استفاده کنیم، کاملاً بستگی به مورد استفاده شما دارد، اما برای تصمیم‌گیری کارآمدتر، بهتر است این تفاوت‌ها را در ذهن داشته باشید. تا بتوانید براساس نیاز و شرایط مورد مناسب‌تر را انتخاب کنید.

اگر دوست داشتید بیشتر درباره Serializableها بدونید، میتونید فصل ۱۱ کتاب EffectiveJava رو بخونید.

این مقاله در اینجا تمام نمی‌شود، با اشتیاق منتظر شنیدن نظراتتون هستم ♥.


منابع

https://android.jlelse.eu/parcelable-vs-serializable-6a2556d51538

https://stackoverflow.com/questions/3323074/android-difference-between-parcelable-and-serializable