Android Parcelable Interface ile Serialization

Android’te Serializable interface’inin kullanımına dayalı olan standart Java serialization mekanizması kullanılabilirse de kütüphanede çoğunlukla alternatif olarak Parcelable interface’inin kullanıldığı görülmektedir. Bu interface’i implemente etmiş olan Gesture, Bundle gibi pek çok örnek kütüphanede bulunmaktadır. Özellikle IPC (Inter Process Communication) mekanizması için önemli olan bu interface Parcel isimli sınıfla birlikte kullanılmaktadır.

Parcelable interface’ini implemente eden bir sınıf writeToParcel() isimli bir fonksiyona sahip olmak zorundadır. Bu fonksiyonun görevi nesnenin durum bilgisini (belirli bir semantiğe uygun şekilde) parametresinde referansı bulunan Parcel nesnesine yazmaktır. Bu işleme terminolojide “marshalling” ismi verilmektedir.

İpucu : Marshalling; verinin saklanmak veya iletilmek üzere dönüştürüldüğü biçim.

Unmarshalling ise bu biçimdeki verinin belirli bir semantiğe göre elde edilerek yeniden nesneleştirilmesidir. Bu işlemden ise Parcelable.Creator isimli interface ve onun createFromParcel() fonksiyonu sorumludur. Aşağıdaki Location isimli sınıfı inceleyiniz.

public class Location implements Parcelable

{

private int x, y;

public Location(int x, int y)

{

this.x = x;

this.y = y;

}

public int getX()

{

return x;

}

public void setX(int x)

{

this.x = x;

}

public int getY()

{

return y;

}

public void setY(int y)

{

this.y = y;

}

///////// Marshalling işlemi //////////

@Override

public int describeContents()

{

return 0;

}

@Override

public void writeToParcel(Parcel dest, int flags)

{

if (x > 0)

{

dest.writeInt(x);

}

if (y > 0)

{

dest.writeInt(y);

}

}

///////// Unmarshalling işlemi //////////

public static final Parcelable.Creator<Location>
CREATOR = new Creator<Location>()

{

@Override

public Location createFromParcel(Parcel source)

{

return new Location(
source.readInt(),
source.readInt());

}

@Override

public Location[] newArray(int size)

{

return new Location[0];

}

};

}

Reklamlar