반응형
What is Parcelable and Serializable
Android 에서 Activity 간 이동이나 다른 앱으로 Component 이동 시 Intent를 사용한다. 이런 경우 데이터 객체를 같이 전달해야하는 경우가 새인다. 이 때 데이터 객체 즉, Class를 직렬화 하는 부분을 추가하여 사용하는데, Parcelizable 과 Serializable을 사용한다.
- 개발자 편의성 측면에서는 Serializable이
- 런타임시 성능 측면에서는 Parcelable 낫다고 함.
- But, 그것에 반대 의견을 제시하는 사람들도 있음. 반대의견보기
Serializable 예시
import java.io.Serializable
data class User(val name: String?, val age: Int): Serializable
Parcelable 예시
import android.os.Parcel
import android.os.Parcelable
data class User(val name: String?, val age: Int): Parcelable {
constructor(parcel: Parcel) : this(
parcel.readString(),
parcel.readInt()
)
override fun describeContents() = 0
override fun writeToParcel(dest: Parcel?, flags: Int) {
dest?.let { it ->
it.writeString(name)
it.writeInt(age)
}
}
companion object CREATOR : Parcelable.Creator<User> {
override fun createFromParcel(parcel: Parcel): User {
return User(parcel)
}
override fun newArray(size: Int): Array<User?> {
return arrayOfNulls(size)
}
}
}
kotlin-parcelize 플러그인
- Parcelable 구현 생성기를 제공한다.
- 사용하려면 build.gradle(:app) 에 아래 플러그러인을 추가해야 한다.
plugins {
id("kotlin-parcelize")
}
import android.os.Parcelable
import kotlinx.parcelize.Parcelize
@Parcelize
data class User(val name: String?, val age: Int): Parcelable
- 클래스의 고급 직렬화가 팔요한 겅우가 있다. 그런 경우 Companion 클래스를 생성해서 그 안에 작성한다.
import android.os.Parcel
import android.os.Parcelable
import kotlinx.parcelize.Parceler
import kotlinx.parcelize.Parcelize
@Parcelize
data class User(val name: String?, val age: Int): Parcelable {
private companion object : Parceler<User> {
override fun create(parcel: Parcel): User {
// Custom write implementation
return User(parcel.readString(), parcel.readInt())
}
override fun User.write(parcel: Parcel, flags: Int) {
// Custom write implementation
parcel.writeString(name)
parcel.writeInt(age)
}
}
}
Intent.putExtra() 에 사용해보기
// LoginActivity.kt
val intent = Intent(this@LoginActivity, MainActivity::class.java)
intent.putExtra("user", User("테스터", 1000))
startActivity(intent)
finish()
// MainActivity.kt
// Serializable
val user = intent.getSerializableExtra("user") as User?
user?.let { u ->
println("이름은 : ${u.name} 그리고 나이는 : ${u.age}")
}
//Parcelable
// 반환형이 T? 이기 때문에 let을 사용하면 좋습니다.
intent.getParcelableExtra<User>("user")?.let { u ->
println("이름은 : ${u.name} 그리고 나이는 : ${u.age}")
}
` Parcelable 플러그인을 사용하면 Parcelable을 보다 쉽게 Serializable처럼 사용 가능하겠습니다. 성능면에서도 조금은 우위가 있다고 하니 조금이라도 성능개선을 하시려는 분에게는 도움이 되지 않을까 싶습니다. 사용법에는 큰 차이가 없으니 본인이 원하는 방법을 선택하시면 될 거 같습니다.
이상입니다.
반응형
'안드로이드' 카테고리의 다른 글
[Android Compose] 안드로이드 컴포즈에서 Glide 호출하기 (0) | 2023.02.20 |
---|---|
[안드로이드/Android] 안드로이드 앱 아이콘 동적 변경하기 (0) | 2023.02.16 |
[안드로이드/Android] WebRTC PeerConnection.IceServer() is deprecated. (0) | 2023.02.13 |
[안드로이드/Android] local.properties 활용하기/변수저장하기 (0) | 2023.02.10 |
[안드로이드/Android] Android Photo Picker directions. (0) | 2023.02.07 |