개발/Android

[Android] Serialize, Parcelable, Parcelize 정리

준그래머 2021. 3. 5. 20:34
반응형

Serialize, Parcelable, Parcelize를 사용하는 이유

기본 자료형과 참조 자료형 객체를 갖고 있는 데이터 클래스를 전달하기 위해 사용한다. 주로 안드로이드에서는 Intent에 데이터 객체 담아 보낼 때 사용된다.

 

Serialize

이름 그대로 데이터를 직렬화 해주는 방식이다. Kotlin에서 구현하면 아래처럼 굉장히 짧게 구현할 수 있다.

data class Player(val league: String, val skill: String): Serializable

reflection이라는 기술을 사용하여 런타임에서 데이터를 직렬화/역 직렬 화하는 과정을 진행하기 때문에 GC가 할 일이 늘어나 속도가 느리다.

 

 

Parcelable

기존 java를 이용해 앱 개발했을 때, 사용하던 방식으로 마찬가지로 데이터 클래스가 전달될 필요가 있을 때 사용된다. 코드를 보면 직렬화와 역직렬화를 모두 구현해 줘야 하기 때문에 코드 길이가 길어진다.

data class Player constructor(var league:String,var skill:String) : Parcelable {

    constructor(parcel: Parcel) : this(
    // pacel에서 String를 읽어오는 과정
        parcel.readString()?:"Null",
        parcel.readString()?:"Null"
    ) 
    
    // writeToParcel은 메서드 이름처럼 Parcel에 순서대로 데이터를 적는 과정 = 데이터 직렬화
    override fun writeToParcel(parcel: Parcel, flags: Int) {
       // league, skill이 순서대로 parcel에 담는중
       // String, Int, Double 등 객체의 타입에 맞게 write(Type)을 맞춰줌
        parcel.writeString(league) 
        parcel.writeString(skill)
    }

    override fun describeContents(): Int {
        return 0
    }

    // companion object를 사용하면 java에서 정적 변수/메서드를 사용하는 것과 동일하다.
    // Parcel에서 Byte단위의 데이터를 복원하고 Player객체를 다시 복원 = 데이터 역직렬화
    companion object CREATOR : Parcelable.Creator<Player> {
        override fun createFromParcel(parcel: Parcel): Player {
            return Player(parcel)
        }
        override fun newArray(size: Int): Array<Player?> {
            return arrayOfNulls(size)
        }
    }
}
​

대신 ​Serialize보다 훨씬 빠르다.

 

 

Parcelize

​Serialize와 Parcelable의 장점을 섞어 놓은 라이브러리로 보인다. 때문에 코드 길이도 짧으면서 속도도 빠르다.

@Parcelize
data class Player constructor(var league:String,var skill:String) : Parcelable

 

​다만 아래 처럼 gradle에 등록해줘야 하며 kotlin으로 개발하는 경우에만 사용할 수 있다.

plugins {
    id("kotlin-parcelize")
}

 

 

 

Parcelable 구현 생성기  |  Kotlin  |  Android Developers

Parcelable 구현 생성기 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. kotlin-parcelize 플러그인은 Parcelable 구현 생성기를 제공합니다. Parcelable 지원을 포함하려

developer.android.com

 

[Android] Kotlin Parcelize 등장 - Serializable vs Parcelable

안드로이드 컴포넌트나 Fragment간에 클래스로 데이터를 주고 받을 때 Serializable, Parcelable을 구현해야 합니다. 직렬화/역직렬화, 마샬링/언마샬링 이라고도 하는 이 두 기법은 아주 빈번하게 사용

simsi6.tistory.com