PARCELABLE mı? SERIALIZABLE mı? İşte bütün mesele bu…

Seyfi Ercan
4 min readFeb 16, 2020

Merhaba arkadaşlar bugün adının çok uzun olduğu bir kelimeyle karşınızdayım. Nedir bu parcelable ve serializable? Bu iki arkadaş data taşımak için kullanılan bir yöntemdir. Bundan sonra referans tiplerimizi rahatlıkla bu yöntemle taşıyabiliriz.

Demem şu ki böl parçala gönder.

Bu iki yöntem ile referans tipleri parçalayıp bir hizaya getiriyoruz daha sonrasında Intent yapısının içerisine koyup diğer bir activitiye taşıyoruz.

Bir class taşınmak istenirse bu class primitive tipe dönüştürülmesi gerekir. Bir classı o classdan oluşturulmuş nesnenin stringe çevrilmesine Serializable işlemi denir. Tam tersi duruma ise deSerializable denir. Yani String bir ifadenin tekrar nesneye dönüştürülmesi işlemidir.

Parcelable Android için Google mühendisleri tarafından sayfalar arası daha hızlı veri transferi yapabilmek için geliştirilmiştir. Parcelable interface performansıyla Serializable'a göre üstünlük sağlıyor. Google mühendislerine göre Parcelable hız konusunda oldukça iyi seviyede. Yani veri transferini hızlı bir şekilde gerçekleştirebiliyor.

Parcelable, Serializable’a göre 10 kat daha hızlıdır .

Bunu bir çok blogda duyacaksınız.Bu Serializable aslında Java kütüphanesiyle çok uzun zamandır bizimle.

Aşağıda bir objenin başka bir activitiye taşınmasını üç örnek ile anlatacağım. Hadi o zaman başlayalım…

class SplashActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_splash1)
btnOpenMainActivity.setOnClickListener { val intent = Intent(this, MainActivity::class.java) val userProfile1 = UserProfile1("Seyfi1",30,true)
intent.putExtra("keyUserName1",userProfile1)
val userProfile2= UserProfile2("Seyfi2",30,true)
intent.putExtra("keyUserName2",userProfile2)
val userProfile3= UserProfile3("Seyfi3",30,true)
intent.putExtra("keyUserName3",userProfile3)
startActivity(intent)
}
}
}

Öncelikle göndermek istediğimiz değişkenlerimizi hazırlıyoruz. Daha sonrasında oluşturmuş olduğumuz nesneleri direkt olarak putExtra methoduyla intent yapısının içine ekliyoruz.

import java.io.Serializabledata class UserProfile1(val keyName : String,
val keyAge : Int,
val isMale : Boolean) : Serializable{
}

UserProfile1 data classımızla göndermek istediğimiz değerleri bir nesne olarak atmak istediğimizde bu örneğimizde Serializable yöntemiyle göndereceğiz. Intentin putExtra methoduna bir nesne koyabiliyoruz ancak bunun Serializable olması gerekiyor. Bu da UserProfile1 nesnesine Serializable interface’inden Serializable implements ederek yapılabilir. Artık kolaylıkla Serializable yöntemiyle nesnelerimizi gönderebiliriz. Çağırmak istediğimiz yerde ise intentin getSerializableExtra methodu ile datalarımızı çekebiliriz. Ancak şunu unutmayın getSerializableExtra’dan sonra “as UserProfile1” yazarak hangi classın nesnesinin tekrardan yaratılacağı belirtilmelidir.

import android.os.Parcel
import android.os.Parcelable
data class UserProfile2(val keyName : String, val keyAge : Int, val isMale : Boolean) : Parcelable{ constructor(parcel: Parcel) : this(
parcel.readString()!!,
parcel.readInt(),
parcel.readByte() != 0.toByte()) {
} override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(keyName)
parcel.writeInt(keyAge)
parcel.writeByte(if (isMale) 1 else 0)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<UserProfile2> {
override fun createFromParcel(parcel: Parcel): UserProfile2 {
return UserProfile2(parcel)
}
override fun newArray(size: Int): Array<UserProfile2?> {
return arrayOfNulls(size)
}
}
}

Bu kadar kodu kim yazacak diyor gibisiniz merak etmeyin bu kadar kodu IDE’miz bize yazdırmayacak. Ctrl + Alt + Enter ile kısa yoldan bu kadar kodu IDE’ye yazdırabilirsiniz.

Bu Parcelable işlemi nasıl oluyor dilim döndüğünce anlatmaya çalışacağım. Burada UserProfile2 nesnesine Parcelable interface’inden Parcelable implements ederek yapacağız. Öncelikle taşımak istediğimiz classda nesne oluşuyor. Ancak bu nesnenin parcelable işlemi putExtra ile diğer classın geçişi sırasında yapılıyor. Öncelikle writeToParcel işlemiyle nesnemizin tek tek parselleme işlemi yapılıyor. Yapısına göre int, string vb. parsel işlemi gerçekleşiyor. Daha sonrasında taşınacak classa giderek getParcelableExtra methoduna bakar ve hangi classın nesnesi yaratılacağını “as UserProfıle2” ile görür ve nesnenin classına geri dönerek CREATOR yapısı ile değişkenlerimizi yaratarak writeToParcel işlemine tabi tutarak oluşturmuş olduğu değişkenlere yazma işlemini yapar. Boylece tekrardan nesnemiz yaratılmış olur.

import android.os.Parcelable
import kotlinx.android.parcel.Parcelize
@Parcelize
data class UserProfile3(val keyName: String, val keyAge: Int, val keyIsMale: Boolean) : Parcelable{
}

Şimdi size bu Parcelable işleminin çok daha kısa yolunu göstereceğim. Şimdi kızacaksınız madem ki kısa yolu vardı neden en baştan göstermedin. Beynimiz her zaman kısa yolu tercih eder ancak kısa yoların olması için öncelikle uzun yolların olduğunu bilmek gerekir.

Parcelize annotation ile bütün yapı kotlin tarafından arka tarafta oluşturulmuş olur. Bize sadece @Parcelize annotation yazmamız kalır.

Not: IDE’niz eski bir sürüm olabilir ya da Parcelize annotation bir türlü çalışmıyor olabilir. İşte bu durumda App düzeyindeki gradle yapınıza aşağıdaki modülü eklemeniz gerekiyor.

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
androidExtensions {
experimental = true
}
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val userProfile1: UserProfile1 = intent.getSerializableExtra("keyUserName1") as UserProfile1

val name1 = UserProfile1.keyName

val userProfile2: UserProfile2 = intent.getParcelableExtra("keyUserName2") as UserProfile2

val name2 = UserProfile2.keyName
val userProfile3: UserProfile3 = intent.getParcelableExtra("keyUserName3") as UserProfile3

val name3 = userProfile3.keyName
Toast.makeText(this, name1+name2+name3,Toast.LENGTH_SHORT).show()
}
}

Ekran çıktısı “Seyfi1Seyfi2Seyfi3” olacaktır.

Facebook | Instagram | Mail| Linkedln|

--

--

Seyfi Ercan
Seyfi Ercan

No responses yet