이웃집에 귤을 나눠주는 상황을 가정하면 Serializable은 아주아주 포장을 꼼꼼하게 하는 상태이다
봉투에 넣고 뽁뽁이로 감싸고 상자에 넣는 작업을 하듯이 데이터를 여러겹으로 감싸서 주는 행위
포장을 잘 했으니 여기저기 들고가도 흘릴일이 없음 범용성이 좋음
-> 안전성은 높지만 속도와 비용이 많이 듦
// 1.모델 타입 변경
data class HappyPlaceModel(
val id : Int,
val title : String,
val image : String,
val description : String,
val date : String,
val location : String,
val latitude : Double,
val longitude : Double,
):Serializable
//2. 데이터를 실어 보내는 부분
// putExtra에 넣어 보내고 있음
private fun setHappyPlaceRecyclerView(
happyPlaceList:ArrayList<HappyPlaceModel>) {
binding!!.rvHappyPlacesList.setHasFixedSize(true) //size 수정
val placesAdapter = HappyPlaceAdapter(happyPlaceList)
binding!!.rvHappyPlacesList.adapter = placesAdapter
placesAdapter.setOnclickListener(object : HappyPlaceAdapter.OnclickListener{
override fun onClick(position: Int, model: HappyPlaceModel) {
startActivity(Intent(this@MainActivity,
HappyPlaceDetailActivity::class.java).putExtra(EXTRA_PLACE_DETAIL, model))
//putExtra는 Serializable 과 Parcelable 모두 지원
}
})
}
//3. 다른 화면에서 데이터 받는 부분
//getSerializableExtra() 메서드는 제네릭 타입을 제공하지 않아서 반환 객체 타입을 컴파일러가 알 수 없다. 따라서 명시적으로 원하는 타입으로 캐스팅 해야한다
var happyplaceDetailModel : HappyPlaceModel? = null
if (intent.hasExtra(MainActivity.EXTRA_PLACE_DETAIL)) {
happyplaceDetailModel = intent.getSerializableExtra(MainActivity.EXTRA_PLACE_DETAIL) as HappyPlaceModel //형변환 필요
}
parcelable 타입을 사용하는 것이 Serialization 타입보다 훨씬 빠르다(약 10배)
꼭 필요한 포장지만 써서 빠르게 주는 방법임
위에서 가정한 이웃집에 귤 나눠주는 상황을 똑같이 가정하면 봉투에 담아 가져다 주는 것과 비슷함 빠르지만 포장을 딜롱해서 안전성 떨어짐. 안드로이드에서만 잘 통함
-> 속도가 빠르고 비용이 적게 듦
//1. 모델 타입 변경
data class HappyPlaceModel(
val id : Int,
val title : String?,
val image : String?,
val description : String?,
val date : String?,
val location : String?,
val latitude : Double,
val longitude : Double,
):Parcelable {
constructor(parcel: Parcel) : this(
parcel.readInt(),
parcel.readString(), //프로그램을 작동하려면 string타입은 모두 null값을 가질 수 있게 해야됨
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readString(),
parcel.readDouble(),
parcel.readDouble()
) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(id)
parcel.writeString(title)
parcel.writeString(image)
parcel.writeString(description)
parcel.writeString(date)
parcel.writeString(location)
parcel.writeDouble(latitude)
parcel.writeDouble(longitude)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<HappyPlaceModel> {
override fun createFromParcel(parcel: Parcel): HappyPlaceModel {
return HappyPlaceModel(parcel)
}
override fun newArray(size: Int): Array<HappyPlaceModel?> {
return arrayOfNulls(size)
}
}
}
//2. 데이터를 실어 보내는 부분(동일)
private fun setHappyPlaceRecyclerView(
happyPlaceList:ArrayList<HappyPlaceModel>) {
binding!!.rvHappyPlacesList.setHasFixedSize(true) //size 수정
val placesAdapter = HappyPlaceAdapter(happyPlaceList)
binding!!.rvHappyPlacesList.adapter = placesAdapter
placesAdapter.setOnclickListener(object : HappyPlaceAdapter.OnclickListener{
override fun onClick(position: Int, model: HappyPlaceModel) {
startActivity(Intent(this@MainActivity,
HappyPlaceDetailActivity::class.java).putExtra(EXTRA_PLACE_DETAIL, model))
//putExtra는 Serializable 과 Parcelable 모두 지원
}
})
}
//3. 다른 화면에서 데이터 받는 부분
// getParcelableExtra<T>()는 구체적인 타입 정보를 제공하기 때문에 타입캐스팅 할 필요가 없다
var happyplaceDetailModel : HappyPlaceModel? = null
if (intent.hasExtra(MainActivity.EXTRA_PLACE_DETAIL)) {
happyplaceDetailModel = intent.getParcelableExtra(MainActivity.EXTRA_PLACE_DETAIL)
}
결론
Serializable은 안전하고 어디서나 쓸 수 있는 타입이나 속도와 비용이 많이 듦
Parcelable 안드로이드에 최적화 되어 있음. 하지만 속도가 빨라 효율적임