본문 바로가기
Android

[Android] Serialize, Parcelable, Parcelize 정리

by 준그래머 2021. 3. 5.
반응형

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

 

반응형